Domyślny typ pobierania dla jednego do jednego, wielu do jednego i jeden do wielu w Hibernate

Jaki jest domyślny typ pobierania w mapowaniach hibernate?

To co się dowiedziałem po zwiedzaniu to:

  • dla jednego do jednego jest to eager .
  • dla jednego do wielu jest to leniwe .

Ale po przetestowaniu go w Eclipse, był chętny dla wszystkich.

Czy to zależy od tego, czy używam JPA czy Hibernate?

Author: nbro, 2014-10-28

4 answers

To zależy od tego, czy używasz JPA czy Hibernate.

Z JPA 2.0 spec , wartości domyślne to:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

A w hibernate wszystko jest leniwe

UPDATE:

Najnowsza wersja Hibernate jest zgodna z powyższymi ustawieniami domyślnymi JPA.

 117
Author: Ashish Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 16:31:19

Wiem, że odpowiedzi były poprawne w momencie zadawania pytania - ale ponieważ ludzie (tak jak ja w tej chwili) nadal zastanawiają się, dlaczego ich WildFly 10 zachowuje się inaczej, chciałbym dać aktualizację dla obecnego Hibernate 5.wersja x:

W Hibernate 5.2 User Guide {[5] } znajduje się w rozdziale 11.2. Stosowanie strategii pobierania :

Rekomendacją Hibernate jest statyczne oznaczanie wszystkich skojarzeń leniwy i używać dynamicznych / align = "left" / To jest niestety w sprzeczności ze specyfikacją JPA, która określa, że wszystkie skojarzenia jeden-do-jednego i wiele-do-jednego powinny być chętnie pobierane domyślnie . Hibernate, jako dostawca JPA, honoruje tę wartość domyślną.

Więc Hibernate również zachowuje się jak Ashish Agarwal podany powyżej dla JPA:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(patrz JPA 2.1 Spec)

 40
Author: Alexander Rühl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 20:31:10

Aby odpowiedzieć na twoje pytanie, Hibernate jest implementacją standardu JPA. Hibernate ma swoje własne dziwactwa działania, ale zgodnie z docs Hibernate

Domyślnie Hibernate używa lazy select fetching dla kolekcji i lazy proxy fetching dla skojarzeń o pojedynczej wartości. Te wartości domyślne mają sens dla większości skojarzeń w większości aplikacji.

Więc Hibernate zawsze załaduje dowolny obiekt używając leniwej strategii pobierania, bez względu na to jaki typ o związku, który zadeklarowałeś. Użyje on leniwego proxy (który powinien być niezainicjowany, ale nie null) dla pojedynczego obiektu w relacji jeden do jednego lub wiele do jednego oraz zbioru null, który będzie nawodniony wartościami, gdy spróbujesz uzyskać do niego dostęp.

Należy rozumieć, że Hibernate będzie próbował wypełnić te obiekty wartościami tylko podczas próby uzyskania dostępu do obiektu, chyba że podasz fetchType.EAGER.

 15
Author: JamesENL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 05:16:46

Dla asocjacji jednowartościowych, tj.-One-to-One i Many-to-One: -
Default Lazy=proxy
proxy lazy loading: - oznacza to, że obiekt proxy powiązanego obiektu jest ładowany. Oznacza to, że tylko identyfikator łączący oba encje jest ładowany dla obiektu proxy powiązanego encji.
NP: A i B to dwa byty z wieloma do jednego skojarzenia. ie: dla każdego B może być wiele A. Każdy obiekt A będzie zawierał odniesienie B.
`

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
relacja A będzie zawierać kolumny (pomoc,oferta,...Pozostałe Kolumny podmiotu a).
Relacja B będzie zawierać kolumny (bid,...inne kolumny podmiotu B)

Proxy oznacza, że gdy pobierane jest A, pobierany jest tylko id dla B i przechowywany w obiekcie proxy B, który zawiera tylko id. Obiekt Proxy klasy B jest obiektem klasy proxy, która jest podklasą klasy B z tylko minimalnymi polami. Ponieważ oferta jest już częścią relacji A, nie jest konieczne odpalanie zapytania aby uzyskać ofertę od relacji B. Inne atrybuty encji B są leniwie ładowane tylko wtedy, gdy dostępne jest pole inne niż bid.

Dla zbiorów, tzn.-Many-to-Many i One-to-Many: -
Default Lazy = true


Należy również pamiętać, że strategia pobierania (select, join itp.) może zastąpić lazy. ie: If Lazy='true' and fetch='join', fetching of A zwróci również B lub Bs (w przypadku kolekcji). Możesz znaleźć powód, jeśli się nad tym zastanowisz.
domyślne pobieranie dla pojedynczej wartości stowarzyszenie to "dołącz".
domyślnym pobieraniem dla kolekcji jest "select". Proszę zweryfikować ostatnie dwie linijki. Wydedukowałem to logicznie.

 0
Author: Jijo Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 07:39:30