2010-12-07 11 views
16

Ich habe eine einfache Frage. Ich fand diese Hibernate Config auf unser Projekt:Hibernate XML Mapping: Lazy False oder Fetch Select?

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    lazy="false" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Hat nicht holen = "select" bedeuten "Lazy Load alle Sammlungen und Einrichtungen", basierend auf Fetching Strategies. Aber indem Sie schreiben lazy = "false" bedeuten nicht faule laden. Die obige Konfiguration sagt also: "Lazy loading deaktivieren. Lazy loading aktivieren." In der Tat bedeutet dies, dass die Eigenschaft faul geladen ist?

So konnte ich diese Konfiguration als verkürzen:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge" 
    fetch="select"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Aber nicht holen = "select" den Standardmodus? In der Tat kann ich die gleiche Konfiguration wie zu erklären:

<many-to-one name="employee" 
    class="com.myapp.Employee" 
    cascade="merge"> 
<column name="employee_id" 
    sql-type="bigint" 
    not-null="true"/> 
</many-to-one> 

Bin ich richtig? Falsch? Ideen? Dank

Wenn ich ein träges Laden aktivieren möchten, muss ich faul = „true“ hinzufügen und entfernen faul = „false“?

Antwort

38

Ich denke, Fetch-Modus und Abrufzeitpunkt sind Konzepte, die nicht vollständig überlappen.

Lazy="true|false" steuert, ob eine Assoziation mit Spannung oder bei Bedarf geladen.

fetch="select|subselect|join|batch" steuert, wie ist diese Einheit oder eine Sammlung geladen wird, wenn es erforderlich ist geladen werden.

Also, Ihre Frage zu beantworten, fetch="select" Mitteln:

„eine zweite SELECT verwendet wird, die zugehörige Einheit oder Sammlung abzurufen Sofern Sie ausdrücklich faul Fetching deaktivieren, indem Sie faul Angabe =.“ False“, das Die zweite Auswahl wird nur ausgeführt, wenn Sie auf die Verknüpfung zugreifen. " (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching)

Dies bedeutet nicht, dass Lazy Loading deaktiviert ist! Das wird durch die Flagge lazy="true|false" gesteuert. Mit lazy="true" und fetch="select" Hibernate lädt die Sammlung faul und lädt sie mit einem Select. Wenn Sie lazy="false" setzen, wird die selbe Auswahl ausgeführt, der Unterschied ist, dass sie schnell ausgeführt wird. Hoffe, das macht Sinn.

Werfen Sie einen Blick auch hier: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

0

Wenn Sie es auf faul stellen, wird die äußere Karte den Mitarbeiter nicht auswählen, wenn es nicht erforderlich ist. Der Abruf zeigt, wie er den Mitarbeiter abfragen würde, wenn es notwendig ist.

+0

beiden Eigenschaften hinzuzufügen ist nicht überflüssig? Sie negieren sich nicht, richtig? – chris

Verwandte Themen