2017-09-10 1 views
4

Ich hatte den Eindruck, dass session.load() lädt das Proxy-Objekt in den Cache, während session.get() immer trifft die Datenbank, aber ich bin verwirrt nach dem Betrachten eines JavaBrains video.Hibernate: Eager und Lazy Laden im Falle von session.load vs session.get

Laut diesem Video, wenn wir die unten get Methode aufrufen, lädt es das Proxy-Objekt von UserDetails in den Speicher.

user = (UserDetails) session.get(UserDetails.class, 1); 

Struktur UserDetails ist

enter image description here

Während im Kommentarbereich, ein Mann und sagte:

es

kein Proxy von Benutzerklasse ist, anstatt das Proxy-Objekt der Sammlung wird erstellt.

Jetzt gibt es zwei Fragen hier.

1st: Bezogen auf Abrufen von Strategien und Erstellen von Proxy-Objekten im Falle von session.load() und session.get(), die unten von mir beantwortet wurden.

2.: In diesem Fall erstellt das Proxy-Objekt für UserDetails oder für die Sammlung (noch zu beantworten).

Dank

Antwort

2

I here

  1. standardmäßig die Antwort bekam, schafft Hibernate Laufzeit Proxies. Sie lädt die Objekte als Proxy, es sei denn, ein Abrufmodus ist angegeben oder auf false festgelegt. Deshalb erstellt es immer den Proxy eines Objekts (egal, ob wir get() oder load() verwenden und welche Abrufstrategie auch immer).

  2. get(), checkt zuerst den Cache, wenn der Proxy vorhanden ist und wenn nicht, trifft er die Datenbank und erstellt gleichzeitig den Proxy des Objekts im Cache und gibt das Proxyobjekt und das Objekt zurück im Cache geladen, führen die nächsten nachfolgenden Aufrufe das wiederholbare Lesen aus.

  3. load() ruft immer Proxy-Objekte ab. Es liest Daten aus dem persistenten Kontext-Cache und wenn der Proxy nicht im Cache vorhanden ist, gibt er null zurück.

+0

Ja, genau das habe ich auch im Kommentar erwähnt. Für Ihren Fall zu testen, warum versuchen Sie nicht 'session.clear()' in Ihrem Code und analysieren Ergebnisse? Zum Löschen von Second-Level-Cache, lesen Sie hier: https://dzone.com/articles/clearing-hibernate-second-leve –

+0

@Rahul, in der Tat hatten Sie Recht, und wenn Sie die zweite Frage beantworten können "In dieser Frage Proxy Objekt wird für UserDetails oder für die Sammlung erstellen? " – Gaurav

1

Hier ist UserDetails die Eltern und Address ist das Kind. Hibernate ist tatsächlich Lazy-Laden des Kindes Address. Also alle Kinder Elemente (Address in diesem Fall) sind nicht vorinstalliert, während Sie das Eltern (UserDetails in diesem Fall) laden.

Also, wenn Sie dies tun:

user = (UserDetails) session.get(UserDetails.class, 1); 

Hibernate tatsächlich nicht alle das Kind zu laden (Collection<Address>). Stattdessen laden Hibernate Address nur, wenn Sie explizit auf sie zugreifen. Also Hibernate nicht DB für Address Tabelle schlagen, es sei denn Sie wirklich brauchen, und das ist der Zweck Lazy Loading.

Was es bedeutet, durch Lazy Loading ist, dass, während Sie ein Proxy-Objekt von UserDetails erhalten, es funktioniert nicht wirklich die Address Tisch schlagen, wenn Sie versuchen, explizit Sammlung Elemente zuzugreifen. Mit anderen Worten, Sie müssen über die Sammlung iterieren, damit der Ruhezustand die Tabelle Address abruft.

Sie könnten sich in einer Situation beenden, in der Sie die Datenbank jedes Mal für jedes Kind (Address) schlagen. Also, rufen Sie listOfAddresses.size() explizit an, um alle Kinder gleichzeitig zu laden.

Beachten Sie auch, dass Lazy Loading standardmäßig für One-To-Many und Many-To-Many Fälle passieren wird.

+0

Meine Frage bezieht sich eigentlich auf Abrufstrategien und Erstellung von Proxy-Objekten im Falle von session.load() und session.get() nicht nur, was eifrig und lazy lädt. – Gaurav

+0

Nun, Sie müssen verstehen, dass 'Load()' implementiert ** Lazy Loading ** und 'Get()' nie einen Proxy zurückgibt. –

+0

@ Rahul, das ist die Frage, warum Proxy-Objekt geladen wird im Fall von get() – Gaurav

-1

2 Ques Am: Proxy wird für Ihre Frage Kontext der Adresse, die Sie das sagen können. In der Tiefe oder im Detail, erste Hibernate erstellt Proxy für Userdetail auch, aber sobald Abfrage, dass Proxy hat Daten. Da der Ruhezustand jedoch standardmäßig "Lazy loading" ist und Address ein untergeordnetes Element in UserDetail ist, wird es nur als Proxy zurückgegeben und Sie erhalten nur den ID-Wert "Address" (Primärschlüsselwert). Verwechseln Sie nicht Proxy. Der Proxy wird für alle Klassen entweder der Elternklasse (UserDetail) oder der Kindklasse (Address) erstellt, für die Kindklasse jedoch nur die ID-Daten.

+0

Ich möchte nur wissen, wer das unten gewählt hat. Kannst du nur erklären, was hier falsch ist. –

Verwandte Themen