2014-08-16 6 views
31

Alles, was ich von Google sammeln konnte, ist, dass:Was enthält das Hibernate-Proxy-Objekt?

  • Hibernate verwendet ein Proxy-Objekt verzögertes Laden zu implementieren. Wenn wir das Objekt aus der Datenbank laden und das abgerufene Objekt einen Verweis auf ein anderes konkretes Objekt hat, gibt Hibernate anstelle des konkreten zugeordneten Objekts einen Proxy zurück.

  • Hibernate erstellt ein Proxy-Objekt mithilfe von Bytecode-Instrumentierung (von javassist bereitgestellt). Hibernate erstellt zur Laufzeit mithilfe der Codegenerierungsbibliothek eine Unterklasse unserer Entitätsklasse und ersetzt das tatsächliche Objekt durch den neu erstellten Proxy.

Also, was genau enthält das Proxy-Objekt?

Enthält es ein Referenzobjekt für ein Skelettobjekt mit nur dem festgelegten ID-Feld? Andere Felder werden gesetzt, wenn wir die Methode get aufrufen.

Enthält das Proxy-Objekt die JDBC-Anweisung, um alle Daten abzurufen, die zum vollständigen Auffüllen des referenzierten Objekts erforderlich sind.

Gibt es noch etwas, das ich vermisse?

Ich frage nicht nach Löffelfütterung, aber wenn Sie irgendeine Verbindung mit Informationen zur Verfügung stellen können, die groß wären.

Jede Korrektur der obigen Beschreibung wird ebenfalls begrüßt.

Beispiel.

class Address { 
    String city; 
    String country; 
} 

class Person{ 
    int id; 
    String name; 
    Address address; 
}  

Wenn wir versuchen, das Person-Objekt zu laden, wird Hibernate Unterklasse Klasse Person wie:

class ProxyPerson extends Person { 
     int id; 
     String name; 
     Address proxyCGLIBObject; 
} 

und gibt ein ProxyPerson Objekt. Objekt von ProxyPerson wird einen Wert für ID und Name aber Proxy für Adresse haben.

Bin ich richtig?

Was kann ich vom Hinzufügen einer toString() - Methode für das Proxy-Objekt erwarten?

Antwort

35

Wie in meinem Buch High-Performance Java Persistence erklärt, wird der Hibernate Proxy verwendet, um eine tatsächliche Entität POJO (Plain Old Java Object) zu ersetzen.

Die Proxy-Klasse wird zur Laufzeit generiert und erweitert die ursprüngliche Entitätsklasse.

Hibernate verwendet Proxy-Objekte für Entitäten, um lazy loading zuzulassen.

Beim Zugriff auf grundlegende Eigenschaften auf dem Proxy delegiert es einfach den Aufruf an die ursprüngliche Entität.

Jeder List, Set, Map Typ in der Objektklasse ist durch einen PersistentList, substituierte PersistentSet, PersistentMap. Diese Klassen sind dafür verantwortlich, einen Aufruf einer nicht initialisierten Sammlung abzufangen.

Der Proxy gibt keine SQL-Anweisung aus.Es löst einfach eine InitializeCollectionEvent aus, die vom zugeordneten Listener verarbeitet wird, der weiß, welche Initialisierungsabfrage ausgegeben werden soll (hängt vom konfigurierten Abrufplan ab).

+0

Danke Vlad, meine Frage nicht in Sammlung, sondern Verweis auf andere Klassen. Bitte sehen Sie sich das Beispiel jetzt an. – vineeshchauhan

+0

Ja, Ihre Annahmen sind richtig. –

+1

Ich verstehe immer noch nicht. – Spider

Verwandte Themen