Frage

Von der API, kann ich sehen, es hat etwas mit Proxy zu tun hat. Aber ich konnte nicht viele Informationen über Proxy und verstehen nicht den Unterschied zwischen Aufruf session.get und session.load. Könnte mir bitte jemand auf eine Referenzseite erklären oder direkt?

Danke !!

War es hilfreich?

Lösung

Aus dem Hibernate Forum :

  

Dies aus dem Buch in Aktion Ruhezustand. Gut man dies erfahren ..


Abrufen von Objekten durch Identifikator Der folgende Hibernate Code-Snippet ruft ein User-Objekt aus der Datenbank:

User user = (User) session.get(User.class, userID);

Die Methode get () ist etwas Besonderes, weil die Kennung eindeutig identifiziert ein einzelnes Instanz einer Klasse. es ist daher häufig für Anwendungen, die Kennung als zu verwenden, bequemer Handgriff auf ein persistentes Objekt. Retrieval von Kennung kann den Cache verwenden wenn ein Objekt abzurufen, drücken Sie eine Datenbank zu vermeiden, wenn das Objekt bereits zwischengespeichert wird. Hibernate bietet auch eine Methode load ():

User user = (User) session.load(User.class, userID);

Die Methode load () ist älter; get () wurde auf Grund eines zu Hibernate API hinzugefügt Anfrage. Der Unterschied ist trivial:

Wenn load () kann das Objekt nicht im Cache oder Datenbank finden, ist eine Ausnahme geworfen. Die Last () Methode gibt nie null. Die get () Methode gibt null, wenn das Objekt nicht gefunden werden kann.

Die Methode load () einen Proxy anstelle einer echten persistenten Instanz kann zurückkehren. Ein Proxy ist ein Platzhalter, der den Laden des realen Objekts ausgelöst wird, wenn es zum ersten Mal zugegriffen wird; Auf der Andererseits get () nie einen Proxy zurückgibt. Die Wahl zwischen get () und Last () ist einfach: Wenn Sie die persistenten sicher sind, Objekt vorhanden ist, und Nicht-Existenz wäre außergewöhnlich betrachtet werden, Last () ist ein gute Wahl. Wenn Sie nicht sicher sind, gibt es eine anhaltende Instanz mit dem angegebenen Kennung, die Verwendung get () und testen Sie den Rückgabewert zu sehen, ob es null ist. Verwendung von load () hat Eine weitere Implikation: Die Anmeldung kann eine gültige Referenz (a proxy) auf ein Abrufen persistenten Instanz, ohne die Datenbank schlägt seinen permanenten Status abzurufen. Damit load () möglicherweise nicht eine Ausnahme auslösen, wenn es Objekt nicht das persistent finden im Cache oder Datenbank; die Ausnahme später geworfen werden, wenn der Proxy zugegriffen. Natürlich wird ein Objekt durch Abrufen Identifikator nicht so flexibel wie unter Verwendung beliebiger Abfragen.

Andere Tipps

Nun, in nhibernate zumindest session.Get (id) wird das Objekt aus der Datenbank zu laden, während session.Load (id) nur ein Proxy-Objekt, um es schafft, ohne den Server zu verlassen. Funktioniert genau wie jede andere faul belastete Eigenschaft in Ihrem POCOs (oder POJOs :). Anschließend können Sie diese Proxy als Referenz auf das Objekt verwenden, selbst Beziehungen zu schaffen, usw.

Denken Sie an es, ein Objekt wie mit, die nur die Id hält, und das wird den Rest laden, wenn Sie jemals brauchen. Wenn Sie vorbei es nur um Beziehungen zu schaffen (wie FKs), die ID ist alles, was Sie jemals brauchen werden.

session.load () wird immer gibt ein „Proxy“ (Hibernate Begriff), ohne die Datenbank zu treffen. In Hibernate, Proxy ist ein Objekt mit dem angegebenen Kennungswert, dessenderen Eigenschaften noch nicht initialisiert werden, wird es wie ein temporäres gefälschtes Objekt anschauen.     Wenn keine Zeile gefunden, wird es eine ObjectNotFoundException wirft.

session.get () treffen immer die Datenbank und das Rück das reale Objekt, ein Objekt, das die Datenbankzeile darstellen, nicht-Proxy.     Wenn keine Zeile gefunden, es null zurück.

Performance mit diesen Methoden macht auch diff. zwischen zwei ...

Ein weiterer Extra-Punkt ::

get-Methode von Hibernate Session-Klasse gibt null zurück, wenn das Objekt nicht im Cache sowie auf Datenbank gefunden wird. während load () Methode löst ObjectNotFoundException, wenn das Objekt nicht auf Cache sowie auf Datenbank, aber nie null zurück.

gefunden

Eine indirekte Folge der Verwendung von „Last“ statt „get“ ist, dass die optimistische Sperren einer Version Attribut kann nicht arbeiten, wie man erwarten würde. Wenn eine Last einfach einen Proxy erstellt und nicht aus der Datenbank gelesen, ist die Version Eigenschaft nicht geladen. Die Version wird nur dann geladen werden, wenn / falls Sie später auf eine Eigenschaft auf dem Objekt verweisen, das Auslösen eine Auswahl. In der Zwischenzeit kann eine weitere Sitzung mit dem Objekt aktualisieren, und die Sitzung wird nicht die ursprüngliche Version, die es braucht, die optimistische Sperrprüfung zu tun -. So aktualisieren Sie Ihre Sitzung wird die andere Sitzung Update ohne Warnung überschreibt

Hier ist ein Versuch, dieses Szenario zu skizzieren mit zwei Sitzungen mit einem Objekt mit der gleichen Kennung arbeiten. Erste Version für das Objekt in DB 10.

Session 1                  Session 2
---------                  ---------
Load object
Wait a while..   
                           Load object
                           Modify object property
                           [triggers db 'select' -
                            version read as 10]
                           Commit
                           [triggers db update,
                            version modified to 11]
Modify object property
  [triggers db 'select' -
  version read as 11]
Commit
  [triggers db update,
  version modified to 12]

Wir wollen eigentlich Session 1 commit mit einer optimistischen Sperre Ausnahme scheitern, aber es wird gelingen hier.

Mit „get“ anstelle von „load“ arbeitet, um das Problem, weil erhalten sofort eine ausgewählte Ausgabe, und die Versionsnummern werden zu den richtigen Zeiten für die optimistische Sperre Überprüfung geladen werden.

Auch müssen wir vorsichtig sein, während Last mit, da es eine Exception aus, wenn das Objekt nicht vorhanden ist. Wir müssen es nur verwenden, wenn wir sicher sind, dass das Objekt vorhanden ist.

Eine ausgezeichnete Erklärung wird unter http: // www.mkyong.com/hibernate/different-between-session-get-and-session-load
session.load ():
Es wird immer ein „Proxy“ (Hibernate term) zurückzukehren, ohne die Datenbank zu schlagen.
In Hibernate, Proxy ist ein Objekt mit dem angegebenen Kennungswert, dessenderen Eigenschaften noch nicht initialisiert, es aussieht wie ein temporäres gefälschtes Objekt. < br> Es wird immer ein Proxy-Objekt mit dem angegebenen Identitätswert zurückgeben, auch der Identitätswert existiert, ist nicht in Datenbank enthalten. Wenn Sie jedoch versuchen, einen Proxy zu initialisieren, indem abzurufen es Eigenschaften von Datenbank, wird die Datenbank mit select-Anweisung getroffen. Wenn keine Zeile gefunden wird, wird ein ObjectNotFoundException werfen.
session.get ():
Es traf immer die Datenbank (falls nicht im Cache gefunden) und senden Sie das reale Objekt, ein Objekt, das die Datenbankzeile darstellt, nicht-Proxy.
Wenn keine Zeile gefunden, es null zurück.

load () kann das Objekt nicht aus dem Cache oder Datenbank findet, wird eine Ausnahme ausgelöst und die Methode load () niemals null zurück.

get () Methode gibt null zurück, wenn das Objekt nicht gefunden werden kann. Die Last () -Methode einen Proxy zurückgeben kann anstelle eines echten persistenten Instanz erhalten () gibt nie einen Proxy-Server.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top