2010-12-07 13 views
16

Mam proste pytanie. Znalazłem ten config hibernacji w naszym projekcie:Mapowanie XML hibernacji: Lazy Fałszywe lub Fetch Wybierz?

<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> 

nie Czy pobierał = „select” znaczy „Lazy załadować wszystkie zbiory i podmioty” w oparciu o Fetching Strategies. Ale pisząc leniwy = "fałsz" oznacza, nie leniwe obciążenia. Tak więc powyższa konfiguracja mówi: "Wyłącz leniwy ładowanie. Włącz leniwy ładowanie". W efekcie oznacza to, że właściwość jest leniwy załadowany?

Więc mogę skrócić ten config jak:

<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> 

Ale nie jest sprowadzić = "Wybierz" trybu domyślnego? W efekcie mogę zadeklarować ten sam konfigurator, co:

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

Czy mam rację? Źle? Pomysły? Dzięki

Jeśli chcę, aby umożliwić leniwy załadunku, muszę dodać leniwy = "true" i usuwania leniwy = "false"?

Odpowiedz

38

Myślę, że tryb Fetch i czas pobrania to pojęcia, które nie nakładają się całkowicie.

Lazy="true|false" określa, czy stowarzyszenie jest ładowane z zapałem lub na żądanie.

fetch="select|subselect|join|batch" określa, w jaki sposób ładuje się tę jednostkę lub kolekcję, gdy jest wymagana do załadowania.

Tak więc, aby odpowiedzieć na to pytanie, mając fetch="select" oznacza:

„drugi SELECT służy do pobierania jednostce stowarzyszonej lub kolekcji Chyba że wyraźnie wyłączyć leniwy sprowadzanie określając leniwy. =” False”, to drugie wybieranie zostanie wykonane dopiero po uzyskaniu dostępu do powiązania. " (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching)

To nie znaczy, że leniwy ładowanie jest wyłączone! Kontrolowane przez flagę lazy="true|false". Z lazy="true" i fetch="select" Hibernate będzie leniwie załadować kolekcję i załaduje ją za pomocą select. Jeśli ustawisz lazy="false", zostanie wykonane to samo wybieranie, różnica będzie taka, że ​​zostanie ono wykonane z niecierpliwością. Mam nadzieję, że to ma sens.

Zobacz również tutaj: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

0

Jeśli ustawisz leniwy, wówczas zewnętrzna mapa nie wybierze pracownika, jeśli nie jest to konieczne. Pobieranie pokazuje, w jaki sposób zapyta pracownika, jeśli będzie to konieczne.

+0

Dodanie zarówno właściwości nie jest zbędny? Nie negują się nawzajem, prawda? – chris