it-swarm.com.de

Was ist Lazy Loading in Hibernate?

Was ist Lazy Loading in Java? Ich verstehe den Prozess nicht. Kann mir jemand helfen, den Prozess des faulen Ladens zu verstehen?

161
rocker

Angenommen, Sie haben einen Elternteil und dieser hat eine Sammlung von Kindern. Hibernate kann jetzt die Kinder "faul laden", was bedeutet, dass nicht alle Kinder geladen werden, wenn die Eltern geladen werden. Sie werden stattdessen geladen, wenn Sie dazu aufgefordert werden. Sie können dies entweder explizit anfordern oder, und das ist weitaus üblicher. Der Ruhezustand lädt sie automatisch, wenn Sie versuchen, auf ein Kind zuzugreifen.

Lazy-Loading kann die Leistung erheblich verbessern, da Sie die Kinder oft nicht benötigen und daher nicht geladen werden.

Hüten Sie sich auch vor dem n + 1-Problem. Der Ruhezustand lädt nicht alle untergeordneten Elemente, wenn Sie auf die Sammlung zugreifen. Stattdessen wird jedes Kind einzeln geladen. Beim Durchlaufen der Auflistung wird für jedes Kind eine Abfrage ausgeführt. Um dies zu vermeiden, können Sie den Hibernate dazu bringen, alle Kinder gleichzeitig zu laden, z. Durch Aufruf von parent.getChildren (). size ().

255
Thomas Lötzer

"Lazy loading" bedeutet, dass eine Entität nur dann geladen wird , wenn Sie tatsächlich auf die Entität für zugreifen erstes Mal.

Das Muster ist wie folgt:

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

Dies spart die Kosten für das Vorladen/Vorfüllen aller Entitäten in einem großen Datensatz im Voraus, während Sie letztendlich nicht alle benötigen von ihnen.

Im Ruhezustand können Sie das langsame Laden einer Sammlung von untergeordneten Entitäten konfigurieren. Das tatsächliche faule Laden erfolgt dann innerhalb der Methoden des PersistentSetNAME _ , das Hibernate "under the hoods" verwendet, um die Sammlung zuzuweisen von Entitäten als Setname__.

Z.B.

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();
}
71
BalusC

Martin Fowler definiert das Lazy Load pattern in Patterns der Enterprise Application Architecture als solches:

Ein Objekt, das nicht alle Daten enthält, die Sie benötigen, aber weiß, wie Sie diese erhalten.

Wenn Sie also ein bestimmtes Objekt laden, sollten Sie die betreffenden Objekte nicht eifrig laden, die Sie möglicherweise nicht sofort verwenden, um die entsprechenden Leistungskosten zu sparen. Stattdessen werden die verwandten Objekte nur geladen, wenn sie verwendet werden. 

Dies ist kein spezielles Muster für den Datenzugriff und den Ruhezustand, aber es ist besonders nützlich in solchen Bereichen. Hibernate unterstützt das langsame Laden von Eins-zu-Viele-Assoziationen und Einzelpunktzuordnungen (Eins-zu-Eins und Viele-zu-Eins) unter bestimmten Bedingungen. Lazy-Interaktion wird in Kapitel 19 der Hibernate 3.0-Referenzdokumentation ausführlicher beschrieben. 

24
Pascal Thivent

Das langsame Laden nach dem Standard ist wahr. Das langsame Laden bedeutet, wenn die Auswahlabfrage ausgeführt wird, trifft sie nicht die Datenbank. Es wird auf die Getter-Funktion warten, d. H. Wenn wir es brauchen, wird es von der Datenbank abgerufen . Zum Beispiel: Sie sind ein Elternteil, der ein Kind mit vielen Spielsachen hat. Aber die aktuelle Ausgabe ist, wann immer Sie ihn anrufen (wir gehen davon aus, dass Sie einen Jungen haben), er kommt auch mit all seinen Spielsachen zu Ihnen. Nun, dies ist ein Problem, da Sie nicht wollen, dass er ständig seine Spielsachen mit sich herumträgt. Wenn Sie also die Mutter sind, legen Sie die Spielzeuge des Kindes als LAZY fest. Wann immer Sie ihn anrufen, kommt er ohne Spielzeug zu Ihnen.

15

Bei einem faulen Abruf wird entschieden, ob untergeordnete Objekte geladen werden sollen, während das übergeordnete Objekt geladen wird. Sie müssen diese Einstellung für die entsprechende Hibernate-Zuordnungsdatei der übergeordneten Klasse vornehmen. Lazy = true (bedeutet, untergeordnetes Objekt nicht zu laden) Standardmäßig ist das verzögerte Laden der untergeordneten Objekte wahr. 

Dadurch wird sichergestellt, dass die untergeordneten Objekte nicht geladen werden, es sei denn, sie werden in der Anwendung explizit durch Aufrufen der getChild()-Methode für übergeordnetes Objekt aufgerufen. In diesem Fall gibt hibernate einen neuen Datenbankaufruf aus, um das untergeordnete Objekt zu laden, wenn getChild() für das übergeordnete Objekt aufgerufen wird.

In einigen Fällen müssen Sie jedoch die untergeordneten Objekte laden, wenn das übergeordnete Element geladen wird. Machen Sie einfach die Lazy = false und der Ruhezustand lädt das untergeordnete Element, wenn das übergeordnete Element aus der Datenbank geladen wird.

Beispiel: Wenn Sie eine TABELLE haben? EMPLOYEE wurde dem Employee-Objekt zugeordnet und enthält einen Satz Adressobjekte. Übergeordnete Klasse: Mitarbeiterklasse, Kindklasse: Adressklasse 

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

In der Datei Employee.hbm.xml 

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

In der obigen Konfiguration. Wenn lazy="false": - Wenn Sie das Employee-Objekt laden, wird auch das untergeordnete Zeitobjekt Address geladen und die Methode setAddresss () festgelegt. Wenn Sie employee.getAdress () aufrufen, werden die geladenen Daten zurückgegeben. Kein neuer Datenbankaufruf. 

Wenn lazy="true": - Dies ist die Standardkonfiguration. Wenn Sie nicht erwähnen, dann überlegen Sie in den Winterschlaf lazy = true. Wenn Sie das Employee-Objekt laden, wird das untergeordnete Zeitobjekt Adresse nicht geladen. Sie benötigen einen zusätzlichen Aufruf der Datenbank, um Adressobjekte abzurufen. Wenn Sie employee.getAdress() aufrufen, wird die Datenbankabfrage ausgelöst, und es werden Ergebnisse zurückgegeben. Neuer Datenbankaufruf.

11
Bhavin Shah

In der Sprache der Laien ist es, als würden Sie einen Kuchen backen und Sie benötigen 5-10 Zutaten aus dem Kühlschrank. Sie haben zwei Möglichkeiten, holen Sie alle Zutaten aus dem Kühlschrank und legen Sie sie auf Ihre Küchenplattform, oder bringen Sie den gewünschten Artikel mit, wenn Sie ihn brauchen.

In ähnlicher Weise holen Sie sich beim eifrigen Laden alle Informationen über Bean und seine verwandten Klassen (kein Kind oder ist-eine Beziehung, sondern hat eine Beziehung, dh Kuchen hat Mehl, Milch, hat Sahne usw.), und im Fall einer verzögerten Ladung zuerst Sie bringen nur den Bezeichner und die Werte mit, die aus derselben Tabelle stammen (notwendige Zutaten, die Sie zuerst in Ihrer Schüssel im Falle eines Kuchens benötigen). Alle Informationen, die aus anderen Tabellen stammen, werden bei Bedarf abgerufen/verwendet.

8
Keyur

Faules Laden? Nun, es bedeutet einfach, dass untergeordnete Datensätze nicht sofort abgerufen werden, sondern automatisch, sobald Sie versuchen, auf sie zuzugreifen.

8
Steffen

Die Lazy-Einstellung entscheidet, ob untergeordnete Objekte geladen werden sollen, während das übergeordnete Objekt geladen wird. Sie müssen die entsprechende Hibernate-Zuordnungsdatei der übergeordneten Klasse festlegen. Lazy = true (bedeutet, Child nicht zu laden) Standardmäßig ist das verzögerte Laden der untergeordneten Objekte true . Dadurch wird sichergestellt, dass die untergeordneten Objekte nicht geladen werden, es sei denn, sie werden in der Anwendung explizit durch Aufrufen der getChild () - Methode für parent aufgerufen. In diesem Fall gibt hibernate einen neuen Datenbankaufruf aus, um das untergeordnete Objekt zu laden, wenn getChild () für das Parent aufgerufen wird object.But jedoch müssen Sie in einigen Fällen die untergeordneten Objekte laden, wenn das übergeordnete Objekt geladen wird. Machen Sie einfach lazy = false, und im Ruhezustand wird das untergeordnete Element geladen, wenn das übergeordnete Element aus der Datenbank geladen wird. Exampleslazy = true (Standardwert) Die untergeordnete Adresse der Benutzerklasse kann als träge festgelegt werden, wenn sie nicht häufig benötigt wird .lazy = falseBut müssen Sie möglicherweise laden Das Objekt "Autor" für "Übergeordnetes Buch", wenn Sie sich mit dem Buch für die Online-Buchhandlung befassen.

3
Siva Chimpiri

Lazy Loading ist ein Designmuster wird häufig in der Computerprogrammierung verwendet um die Initialisierung eines Objekts zu verschieben bis zu dem Punkt, an dem es benötigt wird . Es kann zur Effizienz in der .__ beitragen. Programmbetrieb, falls korrekt und entsprechend verwendet 

Wikipedia

Link von Lazy Loading von hibernate.org

2
Diego Dias

Nun, es bedeutet einfach, die aktuell benötigten Daten zu laden, anstatt ganze Datenbündel gleichzeitig zu laden, die Sie jetzt nicht verwenden. Dadurch wird die Ladezeit der Anwendung schneller als üblich. 

0
Abhinaya Pandey

Durch Lazy Loading können Sie den Abruf von Assoziationen verschieben oder die Abrufstrategie besser steuern.

Wenn Sie das EAGER-Laden verwenden, definieren Sie einen globalen Abrufplan, der zum Zeitpunkt der Abfrage nicht überschrieben werden kann. Dies bedeutet, dass Sie sich auf eine Entscheidung beschränken, die Sie beim Entwerfen Ihres Entitätsmodells getroffen haben. Das Abrufen von EAGER ist ein Codegeruch , da die Abrufstrategie eine Abfragezeitrichtlinie ist und sich von einem Geschäftsanwendungsfall zum anderen unterscheiden kann.

Die Abrufstrategie ist ein sehr wichtiger Aspekt, da ein zu hoher EAGER-Abruf ernste leistungsbezogene Probleme verursachen kann.

0
Vlad Mihalcea

Hiberante unterstützt die Funktion der verzögerten Initialisierung für Entitäten und Sammlungen. Das Hibernate-Modul lädt nur die Objekte, nach denen wir abfragen, und keine anderen Entitäten oder Sammlungen.

 

lazy = "false" Standardmäßig wird beim Initialisieren der Erwähnung für das einzige Kind "lazy." geladen. Ist dies der Fall, werden die untergeordneten Elemente nicht unterstützt

0
abburi

Die Lazy-Einstellung entscheidet, ob untergeordnete Objekte geladen werden sollen, während das übergeordnete Objekt geladen wird. Sie müssen die entsprechende Hibernate-Zuordnungsdatei der übergeordneten Klasse festlegen. Lazy = true (bedeutet, Child nicht zu laden) Standardmäßig ist das verzögerte Laden der untergeordneten Objekte true .

Überraschenderweise spricht keine der Antworten darüber, wie der Winterschlaf hinter den Bildschirmen funktioniert.

Lazy Loading ist ein Entwurfsmuster, das aus Performance-Gründen, die die folgenden Techniken umfassen, effektiv im Ruhezustand verwendet wird.


1. Bytecode-Instrumentierung

Erweitert die Basisklassendefinition mit Hibernate hooks , um alle Aufrufe dieses Entitätsobjekts abzufangen.

Fertig entweder zur Kompilierzeit oder zur [Ladezeit]

1.1 Kompilierzeit

  • Nach der Kompilierzeit

  • Meistens von Maven/Ant-Plugins

1.2 Laufzeit

  • Wenn keine Kompilierzeit-Instrumentation durchgeführt wird, wird diese zur Laufzeit erstellt Verwenden von Bibliotheken wie javassist

2. Proxies

Das Entitätsobjekt, das der Ruhezustand zurückgibt, ist ein Proxy des realen Typs.

Siehe auch: Javassist. Was ist die Hauptidee und wo wird sie eingesetzt?