In diesem Artikel beschreibt die Laien -Lade -Technologie zur Hibernate. Teilen Sie es für Ihre Referenz wie folgt weiter:
Hibernaes faules Laden ist eine sehr häufige Technik. Die Sammelattribute von Entitäten werden standardmäßig verzögert, und die mit Entitäten verbundenen Entitäten werden ebenfalls standardmäßig verzögert. Hibernate verwendet diese verzögerte Belastung, um den Speicheraufwand des Systems zu verringern, wodurch die Betriebsleistung von Winterschlafnate gewährleistet ist.
Lassen Sie uns zunächst das „Geheimnis“ der Hibernate -Verzögerungs -Belastung analysieren.
Fauler Laden von Sammeleigenschaften
Wenn Hibernate eine anhaltende Entität aus der Datenbank initialisiert, wird das Sammelattribut dieser Entität mit der persistenten Klasse initialisiert? Wenn das Sammelattribut 100.000 oder sogar Millionen von Datensätzen enthält, führt das Krabbeln aller Sammelattribute bei der Initialisierung der anhaltenden Einheit zu einem starken Leistungsrückgang. Es ist durchaus möglich, dass das System nur einige Datensätze in den Sammelattributen der persistenten Klasse verwenden muss, und nicht alle Sammlungsattribute. Auf diese Weise müssen nicht alle Sammlungsattribute gleichzeitig geladen werden.
Faule Ladungsstrategien werden im Allgemeinen für die Sammlungsimmobilien empfohlen. Das sogenannte verzögerte Laden besteht darin, zugeordnete Daten aus der Datenbank zu laden, wenn das System Sammlungsattribute verwenden muss.
Beispielsweise enthält die folgende Personklasse ein Sammelattribut, und das Element im Sammelattribut enthält die Typadresse, und der Code -Snippet der Personklasse lautet wie folgt:
Listing 1. Person.java
Personalklasse Person {// Identifizieren Sie das Attribut private Integer -ID; // Name der Person Attribut privater Zeichenfolge Name; // Halten Sie das Altersattribut der Person privates Alter; // Set zum Speichern des Sammlungsattributs Private Set <adresse> adresses = new Hashset <adresse> (); // Die Setter- und Getter -Methoden jedes Attributs sind unten weggelassen ...}Damit Hibernate die Sammlungseigenschaften der persistenten Klasse verwaltet, enthält das Programm die folgenden Zuordnungsdateien für die persistente Klasse:
Listing 2. Person.hbm.xml
<? package = "org.crazyit.app.domain"> <!-Mapping Person Persistenzklasse-> <class name = "person" table = "person_inf"> <!-Mapping Identification Eigenschaft ID-> <id name = "id" columne name = "Alter" type = "int"/> <!-MAP Collection Attribute-> <set name = "adresses" table = "person_address" lazy = "true"> <!-Geben Sie die zugehörige Spalte für fremde Schlüssel an-> <Key Column = "Person_id"/> <Composite-Element> <!-Map normale Attributdetails-> <Eigenschaften "Detail"/> <! name = "ZIP"/> </composite-Element> </set> </class> </hibernate-Mapping>
Aus dem obigen Code, der die Datei ordnet, können wir feststellen, dass die Adressklasse in der Sammlungsattribut der Person nur ein normales Pojo ist. Die Adressklasse enthält zwei Attribute: Detail und Reißverschluss. Da der Adressklassencode sehr einfach ist, wird der Code für diese Klasse hier nicht mehr angegeben.
Der Code im Element <set .../> in der obigen Mapping -Datei gibt Lazy = "true" an (für <set .../> Element, Lazy = "True" ist der Standardwert), der angibt, dass Hibernate das Laden des Adressobjekts im Sammlungsattribut verzögert.
Laden Sie beispielsweise eine Personentität mit ID 1, indem Sie den folgenden Code folgen:
Session Session = sf.getCurrentSession (); Transaction tx = session.beginTransaction (); Person p = (Person) Sitzung.get (Person.Class, 1); // <1> system.out.println (p.getName ());
Der obige Code muss nur mit ID 1 auf die Personentität zugreifen und möchte nicht auf das Adressobjekt zugreifen, das dieser Personentität zugeordnet ist. Zu dieser Zeit gibt es zwei Situationen:
1. Wenn das Laden nicht verzögert wird, greift Hibernate sofort das Adressobjekt, das dem Personentität zugeordnet ist, wenn der Datensatz der Person entspricht.
2. Wenn fauler Laden verwendet wird, lädt der Hibernate nur die Datensätze, die der Person entsprechend entsprechen.
Es ist offensichtlich, dass der zweite Ansatz nicht nur die Interaktion mit der Datenbank verringert, sondern auch den Speicheraufwand vermeidet, der durch Lade von Adressentitäten verursacht wird. Dies ist auch der Grund, warum Hibernate das faule Laden standardmäßig ermöglicht.
Die Frage ist nun, wie faul geladen wird. Hibernate Wie hoch ist der Wert des Eigentums der Personen, wenn sie eine Person einlädt?
Um dieses Problem zu lösen, setzen wir einen Haltepunkt auf den Code <1> und debuggen ihn in Sonnenfinsternis. Zu diesem Zeitpunkt können wir sehen, dass das Fenster Eclipse -Konsolen die Ausgabe hat, wie in Abbildung 1 dargestellt:
Abbildung 1. Konsolenausgabe für faule Lade -Sammlungseigenschaften
Wie in der Ausgabe in Abbildung 1 gezeigt, greift Hibernate nur Daten aus der Datentabelle, die der Personentität entspricht, und erfasst keine Daten aus der Datentabelle, die dem Adressobjekt entspricht. Das ist faul Laden.
Wie lautet das Eigentum der Personentität? Zu diesem Zeitpunkt können Sie die in Abbildung 2 aus dem Fenster Variablen gezeigten Ergebnisse der Eclipse sehen:
Abbildung 2. Lazy Loaded Collection Attributwertewerte
Aus dem Inhalt in der Box in Abbildung 2 ist ersichtlich, dass die Eigenschaften von Adressen nicht die bekannten Implementierungsklassen wie Hashset und Treeset sind, sondern eine Persistenten -Implementierungsklasse, eine Implementierungsklasse, die von Hibernate für die festgelegte Schnittstelle bereitgestellt wird.
Das Persistentset Collection -Objekt erfasst die Daten der zugrunde liegenden Datentabelle nicht wirklich. Daher ist es natürlich unmöglich, das Adressobjekt in der Sammlung wirklich zu initialisieren. Die Persistentset -Sammlung enthält jedoch ein Sitzungsattribut, bei dem es sich um die Hibernate -Sitzung handelt. Wenn das Programm auf das Persistentset -Sammlungselement zugreifen muss, verwendet der PersistentSet dieses Sitzungsattribut, um die Datensätze zu greifen, die dem tatsächlichen Adressobjekt entsprechen.
Was genau holen Sie die Datensätze, die diesen Adressentitäten entsprechen? Dies ist für Persistentset nicht schwierig, da es auch ein Eigentümerattribut in der Persistentset -Sammlung gibt, das die Person angibt, zu der das Adressobjekt gehört. Hibernate sucht nach den Daten aus der Datentabelle, die der Adresse entspricht, die der Datentabelle entspricht.
Beispielsweise klicken wir in der in Abbildung 2 gezeigten Fenster auf die Adresszeile, was bedeutet, dass wir Eclipse das Attribut der Adressen debuggen und ausgeben sollen. Dies soll auf das Attribut der Adressen zugreifen. Zu diesem Zeitpunkt können Sie die folgenden SQL -Anweisungen im Fenster Eclipse -Konsolen sehen:
Wählen Sie die adresses0_.person_id als Person1_0_0_, adress0_.detail as details0_, adress0_.zip als zip0_from person_address adresses0_where adresses0_.person_id =?
Dies sind die Anweisungen für die Sammlung und SQL, die spezifische Adressakten gemäß dem Eigenschaftsattribut des Eigentümers erfassen. Zu diesem Zeitpunkt können Sie den in Abbildung 3 aus dem Fenster Variablen gezeigten Ausgangsfenster von Eclipse sehen:
Abbildung 3. Ladete Sammlungsattributwerte
Wie aus Abbildung 3 ersichtlich ist, wurde das Attribut der Adressen zu diesem Zeitpunkt initialisiert und der Satz enthält 2 Adressobjekte, die die beiden Adressobjekte sind, die der Personentität zugeordnet sind.
Aus der obigen Einführung können wir feststellen, dass der Schlüssel zur Verzögerung des Ladens von festgelegten Attributen von Hibernate in der Persistenten -Implementierungsklasse liegt. Während des faulen Ladens enthält die Persistentset -Sammlung keine Elemente. Persistentset wird jedoch eine Hibernate -Sitzung abhalten, die sicherstellen kann, dass der Datendatensatz, wenn das Programm auf die Sammlung zugreifen muss, "sofort" geladen wird und die Sammelelemente laden.
Ähnlich wie bei der Persistentset -Implementierungsklasse bietet Hibernate auch Persistentlist, PersistentMap, PersistentsortedMap, PersistentsSetSet- und andere Implementierungsklassen und ihre Funktionen ähnlich denen von Persistentset.
Leser, die mit den Attributen zur Sammlung von Hibernate -Sammeln vertraut sind, sollten sich erinnern: Hibernate verlangt, dass Deklare -Sammlungsattribute nur mit Schnittstellen wie festgelegt, list, map, sortiert, sortiertem usw. verwendet werden können und nicht mit Hashset, Arraylist, Hashmap, Treeset, Treemap und anderen Implementierungsklassen implementiert werden können. Der Grund dafür ist, dass Hibernate das Laden der Sammlungsattribute verzögern muss und die Verzögerung des Hibernate auf Persistentset, Persistentlist, PersistentMap, PersistentsortedMap und Persistentsetset zum Abschluss - dh die zugrunde liegende Hibernate -Implementierungsklassen, für die Abschließung des Abschlusses, um die Kollektion zu vervollständigen, zu vervollständigen.
Hibernate verwendet standardmäßig faulen Laden für Sammelattribute. Setzen Sie in einigen speziellen Fällen das Attribut von Lazy = "False" für Elemente wie <set .../>, <list .../>, <map .../>, um das LAY -Laden abzubrechen.
Verzögerung der Belastung der zugehörigen Entitäten
Standardmäßig verwendet Hibernate auch Lazy Loading, um die zugehörige Entität zu laden. Egal, ob es sich um eine Eins-zu-Viele-Vereinigung, eine Eins-zu-Eins-Vereinigung oder eine Viele-zu-Viele-Vereinigung handelt, der Hibernate wird standardmäßig faulen Laden verwenden.
Für zugehörige Einheiten können sie in zwei Fälle unterteilt werden:
1. Wenn es sich bei einem zugehörigen Unternehmen um mehrere Entitäten handelt (einschließlich Eins-zu-Viele, viele zu viele Menschen): Zu diesem Zeitpunkt wird das zugehörige Unternehmen in Form einer Sammlung existieren, und der Hibernate verwendet Persistentset, Persistentlist, PersistentMap, PersistentsortedMap, PersistentsSet und andere Sammlungen, um Lazy-Lade-Laderinnen zu verwalten. Dies ist die zuvor eingeführte Situation.
2. Wenn eine zugehörige Entität eine einzelne Entität ist (einschließlich Eins-zu-Eins-und-eins-Entität): Wenn der Winterschlaf eine Entität lädt, ist die verzögerte zugehörige Entität ein dynamisch erzeugtes Proxy-Objekt.
Wenn es sich bei der zugehörigen Entität um eine einzelne Entität handelt, dh wenn die zugehörige Entität unter Verwendung von <viele zu eins zugeordnet ist, oder <Eins-zu-Eins-.../> können diese beiden Elemente auch das faule Laden durch das faule Attribut angeben.
Das folgende Beispiel ordnet auch die Adressklasse einer anhaltenden Klasse ab. Zu diesem Zeitpunkt wird die Adressklasse auch zu einer Entitätsklasse, und die Personentität und die Adressentität bilden eine Eins-zu-Viele-Zwei-Wege-Vereinigung. Der Zuordnungsdateicode ist zu diesem Zeitpunkt wie folgt:
Listing 3. Person.hbm.xml
<? 3.0 // en "" http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd "> <hibernate-mapping package column = "person_id"> <!-Definieren Sie Primärschlüsselgenerator-Richtlinien-> <generator/> <!-verwendet, um gemeinsame Attribute zuzuordnen-> <Eigenschaft name = "name" type = "String"/> <Eigenschaft name = "Alter" Typ = "int"/> <!-Karten-Sammlungsattribute, das Sammlungselement ist ein weiteres persistentes Einsatz, das keine Kaskade-Attribute spezifiziert. inverse = "true"> <!-Geben Sie die zugehörige Spalte für Fremdschlüssel an-> <Key Column = "person_id"/> <!-verwendet, um den zugehörigen Klassenattributen zuzuordnen-> <Eins-zu-Many/> </set> </class> <!-Map-Adresse Persistent Class-> <class name = "adress" table "adress_inf"> <! Geben Sie die Richtlinie der Primärschlüsselgenerator an-> <Generator/> </id> <!-MAP Normal Attribut Detail-> <Eigenschaft name = "detail"/> <!-MAP Normal Attribut ZIP-> <Eigenschaft name = "Zip"/> <! nicht-null = "true"/> </class> </hibernate-mapping>
Als nächstes lädt das Programm die Personentität mit ID 1 über den folgenden Code -Snippet:
// Öffnen Sie die kontextabhängige Sitzung SessionSession Session = sf.getCurrentSession (); Transaktion TX = Session // <1> system.out.println (address.getDetail ());
Um die Verarbeitung der zugehörigen Entität von Hibernate beim Laden der Adressentität zu sehen, setzen wir einen Haltepunkt auf den Code <1> und debuggen sie in Eclipse. Zu diesem Zeitpunkt können wir sehen, dass das Fenster Eclipse -Konsolen die folgende SQL -Anweisung ausgibt:
Wählen Sie address0_.address_id als addres1_1_0_, adress0_.detail as detail1_0_, addres0_.zip als zip1_0_, adress0_.person_id as Person4_1_0_ von address_inf address0_where adress0_.address_id =?
Aus dieser SQL -Anweisung ist es nicht schwer zu erkennen, dass der Winterschlaf die Datentabelle lädt, die der Adressentität entspricht, um Datensätze zu kriechen, aber keine Datensätze aus der Datentabelle, die der Personentität entspricht, nicht kriechen, nämlich die faule Lade spielt eine Rolle.
Aus dem Fenster Variablen der Sonnenfinsternis siehe die in Abbildung 4 gezeigte Ausgabe:
Abbildung 4. Verzögerte Ladeeinheit
Aus Abbildung 4 ist deutlich zu erkennen, dass die mit der Adressentität zugeordnete Person Entität kein Personobjekt ist, sondern eine Instanz der Person _ $$ _ Javassist_0 Klasse. Diese Klasse ist eine Proxy -Klasse, die mit dem Javassistprojekt dynamisch von Winterschlafate generiert wird. Wenn Hibernate das Laden der zugehörigen Entität verzögert, wird Javassist verwendet, um ein dynamisches Proxy -Objekt zu erzeugen, und dieses Proxy -Objekt ist dafür verantwortlich, das "noch nicht geladene" zu stellten.
Solange die Anwendung eine zugehörige Entität verwenden muss, die "noch nicht geladen" ist, ist die Person _ $$ _ Javassist_0 Proxy -Objekt dafür verantwortlich, die reale zugehörige Entität zu laden und die tatsächliche zugehörige Entität zurückzugeben - dies ist das typischste Proxy -Muster.
Klicken Sie im in Abbildung 4 gezeigten Fenster der Person im Fenster Variablen (dh das Attribut der Person im Debug -Modus), und dann sehen Sie die folgenden SQL -Anweisungen im Konsolenfenster von Eclipse:
Wählen Sie Person0_.person_id als Person1_0_0_, person0_.name als name0_0_, person0_.age ASAGE0_0_ von person_inf person0_where person0_.person_id =?
Die obige SQL -Anweisung ist eine Aussage, die die zugehörige Entität von "Verzögerungsbelastung" erfasst. Zu diesem Zeitpunkt können Sie die in Abbildung 5 der Variablen -Fensterausgabe gezeigten Ergebnisse sehen:
Abbildung 5. Belastete Entität
Hibernate nimmt den Modus "verzögerter Last" an, um die zugehörigen Entitäten zu verwalten. Tatsächlich greift es beim Laden der Hauptentität nicht wirklich die entsprechenden Daten der zugehörigen Entität, sondern erzeugt nur dynamisch ein Objekt als Proxy der zugehörigen Entität. Wenn eine Anwendung wirklich eine zugehörige Entität verwenden muss, ist das Proxy -Objekt dafür verantwortlich, Datensätze aus der zugrunde liegenden Datenbank zu greifen und die reale zugehörige Entität zu initialisieren.
Bei der Ladeverzögerung des Hibernate -Verzögerungen wird das Client -Programm ein dynamisch generiertes Proxy -Objekt abgerufen, während die reale Entität an das Proxy -Objekt für die Verwaltung delegiert wird - dies ist das typische Proxy -Muster.
Agentenmodus
Der Proxy -Modus ist ein Designmodus mit einer sehr breiten Anwendung. Wenn der Client -Code ein Objekt aufrufen muss, ist es dem Client es tatsächlich egal, ob das Objekt genau abgerufen wird. Es benötigt nur ein Objekt, das die Funktion liefern kann. Zu diesem Zeitpunkt können wir den Proxy (Proxy) des Objekts zurückgeben.
In dieser Entwurfsmethode stellt das System einem Objekt ein Proxy -Objekt bereit, und das Proxy -Objekt steuert die Referenz auf das Quellobjekt. Ein Stellvertreter ist ein Java -Objekt, das im Namen eines anderen Java -Objekts handelt. In einigen Fällen möchte der Clientcode den Callee nicht direkt aufrufen, und das Proxy -Objekt kann als Vermittler zwischen dem Client und dem Zielobjekt fungieren.
Für Clients kann es den Unterschied zwischen einem Proxy -Objekt und einem realen Objekt nicht unterscheiden, noch muss der Unterschied zwischen einem Proxy -Objekt und einem realen Objekt unterscheiden. Der Client -Code kennt das echte Proxy -Objekt nicht. Der Client-Code ist interface-orientiert und enthält nur eine Schnittstelle des Proxy-Objekts.
Kurz gesagt, solange der Client -Code nicht direkt auf das aufgerufene Objekt zugreifen kann oder nicht, gibt es viele Gründe für diese Situation, z. B. das Erstellen eines Objekts mit einem hohen Systemaufwand, oder das angerufene Objekt befindet sich auf einem Remote -Host, oder die Funktion des Zielobjekts reicht nicht aus, um den Anforderungen zu erfüllen.
Das Folgende zeigt einen einfachen Proxy -Modus. Das Programm bietet zunächst eine Bildschnittstelle, die die Schnittstelle darstellt, die von einem großen Bildobjekt implementiert wird. Der Schnittstellencode lautet wie folgt:
Auflistung 3. Image.java
public interface Image {void show ();}Diese Schnittstelle bietet eine Implementierungsklasse, die ein großes Bildobjekt simuliert, und der Konstruktor der Implementierungsklasse verwendet die Methode von Thread.sleep (), um 3S zu pause. Im Folgenden finden Sie den Programmcode für die Bigimage.
Listing 4. Bigimage.java
// Verwenden Sie dieses Bigimage, um ein großes Bild zu simulieren, dass öffentliche Klasse Bigimage implementiert wird. System.out.println ("Bildlade erfolgreich ...");} catch (interruptedException ex) {ex.printstacktrace ();}} // Implementieren Sie die modmethode () im Bild public void show () {System.out.println ("Zeichnen Sie das tatsächliche große Bild");Der obige Programmcode pausiert 3S, was darauf hinweist, dass es 3S -Zeitaufwand benötigt, um ein Bigimage -Objekt zu erstellen. Das Programm verwendet diese Verzögerung, um den Systemaufwand zu simulieren, der durch das Laden dieses Bildes verursacht wird. Wenn der Proxy -Modus nicht verwendet wird, generiert das System eine 3S -Verzögerung, wenn Bigimage im Programm erstellt wird. Um diese Verzögerung zu vermeiden, bietet das Programm ein Proxy -Objekt für das Bigimage -Objekt, und die Proxy -Klasse der Bigimage -Klasse lautet wie folgt.
Listing 5. ImageProxy.java
public class ImageProxy implementiert Bild {// Kombinieren Sie eine Bildinstanz als Proxy -Objekt privates Bild Bild; // Verwenden Sie abstrakte Entitäten zum Initialisieren des Proxy -Objekts public imageProxy (Bildbild) {this.image = Bild;}/*** Umschreiben Sie die Show () -Methode () Methode der Bildschnittstelle* Diese Methode wird verwendet, um das Proxy -Objekt zu kontrollieren. show () {// Erstellen Sie das Proxy -Objekt nur if (image == null) {image = new Bigimage ();} image.show ();}}Die obige ImageProxy -Proxy -Klasse implementiert dieselbe Show () -Methode wie BigImage, mit der der Client -Code das Proxy -Objekt nach dem Erhalt des Proxy -Objekts als Bigimage verwenden kann.
Die Kontrolllogik wird zur modus modus () der ImageProxy -Klasse hinzugefügt. Diese Steuerlogik wird verwendet, um zu steuern, dass das Proxy -Bigimage -Objekt nur erstellt wird, wenn das System tatsächlich die Show () des Bildes aufruft. Das folgende Programm muss das Bigimage -Objekt verwenden, das Programm gibt jedoch die Bigimage -Instanz nicht direkt zurück, gibt jedoch zunächst das Bigimage -Proxy -Objekt zurück, wie im folgenden Programm gezeigt.
Listing 6. Bigimagetest.java
public class BigImageTest{public static void main(String[] args){long start = System.currentTimeMillis();// The program returns an Image object, which is just the proxy object of BigImage Image image = new ImageProxy(null);System.out.println("The time overhead of the system obtaining the Image object:" +(System.currentTimeMillis() - start));// Das Programm erstellt tatsächlich das Proxy -Objekt, wenn die messen () -Methode des Bildproxy tatsächlich aufgerufen wird. Image.Show ();}}Das obige Programm initialisiert das Bild sehr schnell, da das Programm das Bigimage -Objekt nicht wirklich erstellt, sondern nur das ImageProxy -Proxy -Objekt erhält, bis das Programm die Bild -Show () -Methode aufruft. Das Programm muss tatsächlich die Show () -Methode () des Bigimage -Objekts aufrufen, und das Programm erstellt tatsächlich das Bigimage -Objekt zu dieser Zeit. Führen Sie das obige Programm aus und sehen Sie die in Abbildung 6 gezeigten Ergebnisse.
Abbildung 6. Verbesserung der Leistung mit dem Proxy -Modus
Wenn die in Abbildung 6 gezeigten laufenden Ergebnisse angezeigt werden, sollten die Leser in der Lage sein, zuzustimmen, dass die Verwendung des Proxy -Modus die Systemleistung des Erhaltens von Bildobjekten verbessert. Aber einige Leser stellen sich möglicherweise Fragen: Wenn ein Programm die Show () -Methode des ImageProxy -Objekts aufruft, muss es auch ein großes Objekt erstellen, aber der Systemaufwand wurde nicht wirklich reduziert? Es ist nur so, dass sich dieses System -Overhead verzögert?
Wir können diese Frage aus den folgenden zwei Perspektiven beantworten:
Durch die Verzögerung der Schaffung von Bigimage, bis es wirklich benötigt wird, kann der reibungslose Betrieb des vorherigen Programms sichergestellt und die Überlebenszeit von Bigimage im Speicher verkürzt und den Speicheraufwand des Systems aus Makroperspektive speichert.
In einigen Fällen wird das Programm möglicherweise niemals die modmethode () des ImageProxy -Objekts aufrufen - was bedeutet, dass das System überhaupt kein großes Objekt erstellen muss. In diesem Fall kann die Verwendung des Proxy -Modus die Systembetriebsleistung erheblich verbessern.
Insgesamt ähnlich, verwendet Hibernate auch den Proxy -Modus, um die Zeit zum Laden der zugehörigen Entität zu "verzögern". Wenn das Programm nicht auf die zugehörige Entität zugreifen muss, kriecht das Programm nicht die zugehörige Entität. Dies kann den Speicheraufwand des Systems speichern und die Zeit verkürzen, in der Hibernate die Entität lädt.
Zusammenfassung
Hibernate Lazy Load ist im Wesentlichen eine Anwendung des Proxy -Modus. In den letzten Jahren haben wir häufig den Proxy -Modus verwendet, um den Überkopf der Systemspeicher zu reduzieren und die Anwendungsleistung zu verbessern. Hibernate nutzt diesen Vorteil des Proxy -Modus und kombiniert Javassist oder CGlib, um proxy -Objekte dynamisch zu generieren, was dem Proxy -Modus Flexibilität verleiht. Hibernate gibt dieser Verwendung einen neuen Namen: Lazy Loading. In jedem Fall kann die vollständige Analyse und Verständnis der Implementierung dieser Open -Source -Frameworks die Vorteile klassischer Designmodelle besser erleben.
Ich hoffe, dass die Beschreibung in diesem Artikel für Java -Programme aller hilfreich ist, die auf dem Hibernate -Framework basieren.