2012-09-24 24 views
7

Wierzę, że istnieją tylko dwa sposoby ładowania obiektów za pomocą Hibernate i to jest leniwe ładowanie, a jeden jest chętny do ładowania. Leniwe ładowanie ma swoje zalety, nie ładuje wielu obiektów, ale tylko wtedy, gdy ich potrzebujesz. Dowiedziałem się również, że jeśli chcesz wymusić załadowanie wszystkich dzieci dla obiektu, możesz po prostu zadzwonić pod numer parent.getChildren().size(). Więc powiedzmy, że mamy następujące obiektykiedy używać Lazy loading/Eager loading in hibernate?

@Entity 
public class Customer{ 
public Set<Order> order; 
} 

@Entity 
public class Order{ 
} 

Załóżmy mamy klientów, który dokonał zamówienia w naszym systemie, a może to być więcej niż jeden, a nawet zerowa. Tak więc moje pytanie brzmi: czy nie lepiej jest zawsze używać szybkiego ładowania w tym przypadku? potrzebujemy rozmiaru lub informacji dotyczących zamówienia związanego z klientem. Jaka jest korzyść z używania leniwego ładowania w tej sytuacji, czy są jakieś korzyści?

Staram się zrozumieć, gdzie należy korzystać z leniwego ładowania i gdzie należy korzystać z szybkiego ładowania, bardzo doceniam twój wgląd.

Odpowiedz

19

Próbuję zrozumieć gdzie używać leniwy załadunku i gdzie używać chętny załadunek, wysoko oceniają swoją wiedzę.

Oto kilka myśli:

1) Jeśli masz zamiar użyć zawsze coś (na pewno), można chętny obciążenie go.
2) Powiązane z 1, jeśli prawie nigdy nie będziesz używać czegoś, leniwy załaduj go.
3) Leniwe ładowanie wydaje się być bardziej przydatne w przypadku dużych kolekcji.
4) Chwila ładowania rzeczy zmniejszy błędy związane z sesją, potencjalnie kosztem trafienia wydajności.
5) W przypadku skomplikowanych modeli danych i/lub dużych baz danych, zobaczysz, jak aplikacja ładuje i dostosowuje swoje strategie.
6) Po raz pierwszy trudno jest zrobić to dobrze. Rób to, co jest właściwe, i nie bój się zmieniać w razie potrzeby.
7) W przypadku dużych zestawów danych prawdopodobnie skończy się pisanie niestandardowych hql/zapytań i tak, gdzie domyślne mapowania mogą zostać nadpisane, więc leniwy kontra chętny nie będzie miał większego znaczenia.

Jeśli uważasz, że # 6, to nie utknąć próbując zaplanować zbyt daleko, i zmienić go, jeśli musisz.

WRT Twój konkretny przykład, to pewnie napisać kilka zapytań do dostępu do danych (napędzany za pomocą odpowiednich potrzeb biznesowych, oczywiście)

1) Zapytanie który ładuje klienta i pozostawia zamówień w db (tak leniwy ładowanie), że zadzwoniłbym, gdy potrzebuję uzyskać informacje o kliencie
2) Zapytanie, które ładuje klienta i wszystkie informacje o zamówieniu, w przypadkach, gdy jest to potrzebne.W takim przypadku zignoruję domyślne mapowanie.

Przy tych dwóch kwerendach w miejscu, na moich warstwach usług mam narzędzia, które muszę zrobić, co jest poprawne w zależności od kontekstu sytuacji.

+0

Całkowicie się zgodziłem, pisanie dwóch osobnych zapytań jest o wiele lepsze niż używanie leniwych/chętnych do ładowania. Dzięki za wyjaśnienie. –

+0

@hvgotcodes Czy możesz wyjaśnić, jak osiągnąć punkt # 7? –

5

Ten link idealnie odpowiada na twoje pytanie.

leniwy załadunku jest stosowany w przypadkach, gdy odnośne wielkości podmiotem jest ogromny i to nie muszą być pobierane za każdym razem, z drugiej strony

EAGER należy stosować właściwą analizą, jak ładuje relacji każdym razem główną Obiekt jest załadowany.

Więc jeśli związek jest absolutnie niezbędny do obliczeń logiki biznesowej, powinieneś pomyśleć o korzystaniu z ładowania EAGER; LAZY ładowanie będzie służyć większości przypadków i zapewnia mniej problemów z wydajnością.

Powiązane problemy