Jaki jest domyślny typ pobierania w odwzorowaniach w trybie hibernacji?
Po eksploracji dowiedziałem się:
- dla jednego do jednego jest chętny .
- dla jednego do wielu jest leniwy .
Ale po przetestowaniu go w Eclipse był chętny do wszystkiego.
Czy to zależy od tego, czy używam JPA czy hibernacji?
Odpowiedzi:
To zależy od tego, czy używasz JPA czy Hibernacji.
Ze specyfikacji JPA 2.0 wartości domyślne to:
A w stanie hibernacji wszystko jest leniwe
AKTUALIZACJA:
Najnowsza wersja Hibernate jest zgodna z powyższymi domyślnymi ustawieniami JPA.
źródło
Wiem, że odpowiedzi były poprawne w momencie zadawania pytania - ale ponieważ ludzie (tacy jak ja w tej chwili) wciąż zastanawiają się, dlaczego ich WildFly 10 zachowywał się inaczej, chciałbym podać aktualizację dla obecnego Hibernate 5 wersja .x:
W Podręczniku użytkownika Hibernate 5.2 jest to opisane w rozdziale 11.2. Stosowanie strategii pobierania :
Zatem Hibernate również zachowuje się tak, jak wspomniany powyżej Ashish Agarwal dla JPA:
(patrz specyfikacja JPA 2.1 )
źródło
Odpowiadając na twoje pytanie, Hibernate jest implementacją standardu JPA. Hibernate ma swoje własne dziwactwa, ale zgodnie z dokumentacją Hibernate
Zatem Hibernate zawsze ładuje dowolny obiekt przy użyciu leniwej strategii pobierania, bez względu na typ zadeklarowanej relacji. Użyje leniwego serwera proxy (który powinien być niezainicjowany, ale nie zerowy) dla pojedynczego obiektu w relacji jeden do jednego lub wiele do jednego oraz pustej kolekcji, którą nawadni wartościami, gdy spróbujesz uzyskać do niego dostęp .
Należy rozumieć, że Hibernate będzie usiłował wypełnić te obiekty wartościami tylko wtedy, gdy spróbujesz uzyskać dostęp do obiektu, chyba że określisz to
fetchType.EAGER
.źródło
W przypadku asocjacji o pojedynczej wartości, tj.-Jeden do jednego i Wiele do jednego: -
Domyślnie Lazy = proxy Leniwe
ładowanie proxy : - Oznacza to, że ładowany jest obiekt proxy powiązanej jednostki. Oznacza to, że tylko identyfikator łączący dwie jednostki jest ładowany dla obiektu proxy powiązanej jednostki.
Np .: A i B to dwa byty ze skojarzeniem Wiele do jednego. tj .: może istnieć wiele A dla każdego B. Każdy obiekt A będzie zawierał odniesienie do B.
"
`
Relacja A będzie zawierała kolumny (pomoc, oferta, ... inne kolumny podmiotu A).
Relacja B będzie zawierała kolumny (cena ofertowa, ... inne kolumny jednostki B).
Proxy oznacza, że kiedy A jest pobierane, tylko id jest pobierane dla B i przechowywane w obiekcie proxy B, który zawiera tylko id. Obiekt proxy klasy B jest obiektem klasy proxy będącej podklasą klasy B z minimalną liczbą pól. Ponieważ oferta jest już częścią relacji A, nie jest konieczne uruchamianie zapytania w celu uzyskania oferty z relacji B. Inne atrybuty jednostki B są ładowane leniwie tylko wtedy, gdy jest otwierane pole inne niż oferta.
Dla kolekcji, tj.-Wiele-do-wielu i jeden-do-wielu: -
Domyślnie Lazy = true
Należy również pamiętać, że strategia pobierania (wybierz, dołącz itp.) Może zastąpić leniwość. tj .: Jeśli lazy = 'true' i fetch = 'join', pobranie A spowoduje również pobranie B lub Bs (w przypadku kolekcji). Możesz znaleźć powód, jeśli o tym pomyślisz.
Domyślne pobieranie dla asocjacji o pojedynczej wartości to „dołącz”.
Domyślne pobieranie dla kolekcji to „wybierz”. Sprawdź ostatnie dwie linie. Wydedukowałem to logicznie.
źródło