2010-02-03 15 views

Odpowiedz

240

Załóżmy, że masz rodzica i ten rodzic ma kolekcję dzieci. Hibernate może teraz "leniwie załadować" dzieci, co oznacza, że ​​w rzeczywistości nie ładuje wszystkich dzieci podczas ładowania rodzica. Zamiast tego ładuje je, gdy zostanie o to poproszony. Możesz zażądać tego wprost lub - i jest to o wiele bardziej powszechne - hibernacja ładuje je automatycznie podczas próby uzyskania dostępu do dziecka.

Lazy-loading może znacznie poprawić wydajność, ponieważ często nie będziesz potrzebować dzieci, więc nie będą one ładowane.

Należy również zwrócić uwagę na problem z n + 1. Hibernacja w rzeczywistości nie załaduje wszystkich dzieci po uzyskaniu dostępu do kolekcji. Zamiast tego załaduje każde dziecko indywidualnie. Podczas iteracji nad kolekcją powoduje to zapytanie dla każdego dziecka. Aby tego uniknąć, możesz oszukać hibernate w ładowanie wszystkich dzieci jednocześnie, np. przez wywołanie parent.getChildren(). size().

+0

Ładne wyjaśnienie –

+75

co za podstęp !! parent.getChildren(). size(); +1 –

+3

Alternatywnie należy użyć Hibernate.initialize (parent.getChildren()) – HakunaMatata

5

Leniwe ładowanie? Oznacza to po prostu, że rekordy podrzędne nie są pobierane natychmiast, ale automatycznie, gdy tylko spróbujesz uzyskać do nich dostęp.

2

Lazy loading jest wzorzec projektowy powszechnie stosowany w programowaniu komputerowym odroczyć inicjalizacji obiektu aż do punktu, w którym jest to potrzebne. Może to przyczynić się do skuteczności w działaniu programu jeśli właściwie i odpowiednio wykorzystane

Wikipedia

Link Lazy Loading z hibernate.org

66

"Lazy loading" oznacza, że ​​jednostka zostanie załadowany tylko po faktycznie uzyskuje dostęp do jednostki dla najpierw czasu.

pattern jest tak:

public Entity getEntity() { 
    if (entity == null) { 
     entity = loadEntity(); 
    } 
    return entity; 
} 

Oszczędza koszty wstępnego ładowania/wstępne napełnienie wszystkie podmioty w dużym zbiorze danych uprzednio podczas przecież faktycznie nie trzeba wszystkie z nich.

W stanie hibernacji można skonfigurować ładowanie laciwej kolekcji elementów podrzędnych. Rzeczywiste ładowanie jest następnie wykonywane wewnątrz metod , które Hibernate używa "pod maskami", aby przypisać kolekcję obiektów jako Set.

E.g.

public class Parent { 
    private Set<Child> children; 

    public Set<Child> getChildren() { 
     return children; 
    } 
} 

.

public void doSomething() { 
    Set<Child> children = parent.getChildren(); // Still contains nothing. 

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set. 
    children.size(); 
    children.iterator(); 
} 
+0

Mam taki sam przypadek i hibernacja zgłasza wyjątek podczas uzyskiwania dostępu do zestawu children = parent.getChildren(); , czy istnieje opcjonalna konfiguracja, aby to się stało – bmscomp

22

Martin Fowler definiuje wzór w Patterns of Enterprise Application ArchitectureLazy Load jako takie:

Obiekt, który nie zawiera wszystkich potrzebnych danych, ale nie wie, jak je zdobyć.

Więc podczas ładowania danego przedmiotu, chodzi o to, aby nie chętny obciążenie pokrewny obiekt (-y), że nie można użyć natychmiast zapisać związanych z nimi kosztów wykonania. Zamiast tego powiązane obiekty zostaną załadowane tylko wtedy, gdy zostaną użyte.

Nie jest to wzorzec charakterystyczny dla dostępu do danych i hibernacji, ale jest szczególnie przydatny w takich polach, a Hibernate obsługuje leniwy ładowanie jedno do wielu skojarzeń i jednopunktowych skojarzeń (jeden do jednego i wiele do -jeden) również pod pewnymi warunkami. Lazy interakcja jest omówiona bardziej szczegółowo w Chapter 19 dokumentacji referencyjnej Hibernate 3.0.

0

Hiberante obsługuje funkcję leniwej inicjalizacji dla obu podmiotów i kolekcji. Silnik hibernacji ładuje tylko te obiekty, o które pytamy, a nie inne obiekty ani kolekcje.

leniwy = „false” domyślnie załadunku inicjalizacji wyróżnienie dla jedynego dziecka jest lazy.in przypadek jest prawdą, że rodzic jest ładowanie nie alimentów

3

Lazy ustawienie decyduje, czy ładowanie obiektów podrzędnych podczas ładowania obiektu nadrzędnego. Musisz to zrobić w odpowiednim pliku odwzorowania hibernacji w klasie nadrzędnej.Lazy = true (oznacza, że ​​nie ma załadować elementu potomnego) Domyślnie leniwy ładunek obiektów podrzędnych jest prawdziwy. To upewnia się, że obiekty podrzędne nie są załadowane, chyba że są jawnie wywoływane w aplikacji przez wywołanie metody getChild() na obiekcie nadrzędnym.W tym przypadku hibernacja wywołuje nowe wywołanie bazy danych, aby załadować dziecko, gdy funkcja getChild() jest aktywnie wywoływana w obiekcie nadrzędnym obiekt.Ale w niektórych przypadkach konieczne jest załadowanie obiektów podrzędnych po załadowaniu elementu nadrzędnego. Po prostu spraw, aby leniwy = false i hibernacja załadują dziecko, gdy rodzic jest załadowany z bazy danych.Exampleslazy = true (domyślnie) Adres child klasy User może być leniwy, jeśli nie jest wymagany frequenzy = falseBut może być konieczne załadowanie Obiekt autora książki rodzica za każdym razem, gdy zajmujesz się książką dla księgarni internetowej.

0

Ustawienie leniwy decyduje, czy załadować obiekty podrzędne podczas ładowania obiektu nadrzędnego.Musisz zrobić to ustawienie odpowiedniego pliku odwzorowania hibernacji w klasie nadrzędnej.Lazy = true (znaczy, aby nie załadować elementu podrzędnego) Domyślnie leniwy ładunek obiekty podrzędne są prawdziwe.

12

Leniwy załadunek Bydfault jest prawdziwy. Lazy ładowanie oznacza, że ​​po wykonaniu kwerendy wyboru nie trafi w bazę danych. Będzie czekać na funkcję gettera, czyli wtedy, gdy będziemy tego wymagać, pobierze z bazy danych. Na przykład: Jesteś rodzicem, który ma dziecko z mnóstwem zabawek. Ale aktualny problem pojawia się zawsze, gdy go nazwiesz (zakładamy, że masz chłopca), on przychodzi do ciebie z wszystkimi jego zabawkami. To jest problem, ponieważ nie chcesz, aby cały czas nosił swoje zabawki. Będąc rodzicem racjonalnym, idź przed siebie i zdefiniuj zabawki dziecka jako LAZY. Teraz, kiedy do niego zadzwonisz, przychodzi do ciebie bez jego zabawek.

+3

To jest dobra analogia – Siddhartha

7

Lazy Fetching decyduje, czy załadować obiekty podrzędne podczas ładowania obiektu nadrzędnego. Należy wykonać to ustawienie odpowiedniego pliku odwzorowania hibernacji dla klasy nadrzędnej. Lazy = true (oznacza nie ładowanie podrzędnego) Domyślnie leniwy ładunek obiektów podrzędnych jest prawdziwy.

to upewnij się, że obiekty podrzędne nie są załadowane, chyba że są one wyraźnie wywoływana w aplikacji poprzez wywołanie getChild() metodę na parent.In ta sprawa hibernacji wystawia świeże połączenie z bazą danych, aby załadować, gdy dziecko jest actully getChild() wezwał Dominującej obiekt.

Jednak w niektórych przypadkach konieczne jest załadowanie obiektów podrzędnych po załadowaniu rodzica. Po prostu spraw, aby leniwy = false i hibernacja załadowały dziecko, gdy rodzic został załadowany z bazy danych.

Przykład: Jeśli masz TABELĘ? PRACOWNIK zamapowany na obiekt pracownika i zawiera zestaw obiektów adresów. nadrzędna Klasa: klasa Pracownik, Dziecko klasa: Adres Klasa

public class Employee { 
private Set address = new HashSet(); // contains set of child Address objects 
public Set getAddress() { 
return address; 
} 
public void setAddresss(Set address) { 
this. address = address; 
} 
} 

W Employee.hbm.xml złożyć

<set name="address" inverse="true" cascade="delete" lazy="false"> 
<key column="a_id" /> 
<one-to-many class="beans Address"/> 
</set> 

W powyższej konfiguracji. Jeśli lazy="false": - po załadowaniu obiektu Employee, adres czasu podrzędnego obiektu zostanie załadowany i ustawiony na metodę setAddresss(). Jeśli wywołasz metodę employee.getAdress(), to zwróci się zwrócone dane. Brak świeżego wywołania bazy danych.

Jeśli lazy="true": - Jest to domyślna konfiguracja. Jeśli nie wspominasz o hibernacji, zastanów się nad lenią = prawda. po załadowaniu obiektu Pracownik, który nie był ładowany obiekt podrzędny adres. Potrzebujesz dodatkowego połączenia z bazą danych, aby uzyskać obiekty adresowe. Jeśli zadzwonisz pod numer employee.getAdress(), wówczas zapytanie bazy danych uruchomi się i zwróci wyniki. Świeże połączenie z bazą danych.

+0

Pracownik i adres nie ma relacji rodzic-dziecko w tym scenariuszu. To jest ** stosunek "ma-a" **! – Ram

1

Lazy inicjalizacja to optymalizacja wydajności. Jest używany, gdy dane są z jakiegoś powodu uważane za "drogie". Na przykład: , jeśli wartość parametru hashCode obiektu może nie być rzeczywiście potrzebna dla osoby wywołującej, zawsze obliczanie parametru hashCode dla wszystkich wystąpień obiektu może być niepotrzebne. ponieważ dostęp do systemu plików lub sieci jest stosunkowo powolny, takie operacje należy odłożyć, dopóki nie będą absolutnie wymagane.

leniwe inicjowanie ma dwa cele: opóźnienie operacja kosztowna, dopóki nie jest to absolutnie konieczne sklep wynikiem tej kosztownej operacji, tak że nie trzeba będzie powtórzyć to jeszcze raz

5

W języku laika jest to jak ty robią ciasto i będziesz potrzebował 5-10 składników z lodówki. Masz dwie opcje, aby uzyskać wszystkie składniki z lodówki i umieścić je na platformie kuchennej lub przynieść przedmiot, który chcesz, kiedy potrzebujesz .. Podobnie w upragnionym ładowaniu pobierasz wszystkie informacje o fasoli i powiązanych z nią klasach (nie dziecko lub jest relacją ale ma związek, tzn. ciasto ma mąkę, ma mleko, ma krem ​​itp.), a w przypadku leniwego załadunku najpierw podaje się tylko jego identyfikator i wartości, które pochodzą z tego samego stołu (niezbędne składniki, które najpierw będą potrzebne w misce w przypadku z ciasta) .. wszystkie informacje pochodzące z innych tabel będą pobierane w miarę potrzeby/używane.

Nadzieja to pomaga :)

0

Lazy loading pozwala odroczyć pobieranie stowarzyszenie lub mieć lepszą kontrolę nad strategią sprowadzania.

Podczas ładowania EAGER definiujesz globalny plan pobierania, którego nie można przesłonić w czasie zapytania, co oznacza, że ​​ograniczasz się do decyzji podjętej podczas projektowania modelu jednostki. The EAGER fetching is a code smell, ponieważ strategia pobierania jest polityką czasu zapytania i może różnić się od przypadku użycia biznesowego do innego.

The fetching strategy jest bardzo ważnym aspektem, ponieważ zbyt dużo pobierania EAGER może powodować poważne problemy związane z wydajnością.

0

Oznacza to po prostu ładowanie danych, które są obecnie potrzebne, zamiast ładowania całej gamy danych naraz, których teraz nie będziesz używać. Dzięki temu czas ładowania aplikacji jest szybszy niż zwykle.

0

Co zaskakujące, żadna z odpowiedzi nie mówi o tym, w jaki sposób jest osiągany przez hibernację za ekranami.

Lazy loading to wzorzec projektowy, który jest skutecznie wykorzystywany w procesie hibernacji ze względu na wydajność, który obejmuje następujące techniki.


1. Kod Byte oprzyrządowanie:

Poprawia definicję klasy bazowej z hibernacji hooks aby przechwycić wszystkie połączenia do tego obiektu podmiotu.

odbywać się albo w czasie kompilacji i run [obciążenia] Termin

1,1 czasie kompilacji

  • post kompilacji Czas działania

  • , zwykle w maven/mrówek wtyczek

1.2 czas Run

  • Jeśli nie kompilacji oprzyrządowanie czas jest zrobione, to jest tworzone w czasie wykonywania Korzystanie z bibliotek takich jak javassist

2. Proxies

Przedmiotem podmiot hibernacji Powroty proxy prawdziwego typu.

Zobacz także: Javassist. What is the main idea and where real use?

Powiązane problemy