webentwicklung-frage-antwort-db.com.de

Was ist der Vorteil von load () vs get () in Hibernate?

Kann mir jemand sagen, was der Vorteil von load () vs get () in Hibernate ist?

51
Antonio

Was ist der Vorteil von load () vs get () in Hibernate? 

 enter image description here
Quelle

Proxy bedeutet, der Ruhezustand bereitet ein falsches Objekt mit einem angegebenen Bezeichnerwert im Speicher vor, ohne eine Datenbank zu treffen.
 enter image description here

Zum Beispiel:
Wenn wir session.load(Student.class,new Integer(107)); aufrufen 

im Ruhezustand wird ein gefälschtes Student-Objekt [Zeile] mit der ID 107 im Speicher erstellt. Die restlichen Eigenschaften der Student-Klasse werden jedoch nicht einmal initialisiert.

Quelle

38
Premraj

Die Erklärung der Semantik dieser Methoden erklärt nicht den praktischen Unterschied zwischen ihnen. Praktische Regel ist die folgende:

  • Verwenden Sie get(), wenn Sie ein Objekt laden möchten

  • Verwenden Sie load(), wenn Sie einen Verweis auf das Objekt abrufen müssen, ohne zusätzliche SQL-Abfragen ausgeben zu müssen, um beispielsweise eine Beziehung zu einem anderen Objekt zu erstellen:

    public void savePost(long authorId, String text) {
        Post p = new Post();
        p.setText(text);
    
        // No SELECT query here. 
        // Existence of Author is ensured by foreign key constraint on Post.
        p.setAuthor(s.load(Author.class, authorId));
    
        s.save(p);
    }
    
62
axtavt

Aus dem Buch "Java Persistence with Hibernate", Seite 405:

Der einzige Unterschied zwischen get () und load () ist, wie sie angeben, dass Die Instanz konnte nicht gefunden werden. Falls keine Zeile mit dem angegebenen Bezeichner Wert ist in der Datenbank vorhanden, get () gibt null zurück. Die load () - Methode Löst eine ObjectNotFoundException aus. Sie haben die Wahl was Fehlerbehandlung, die Sie bevorzugen.

Noch wichtiger ist, t die Methode load () kann Einen Proxy zurückgeben, einen Platzhalter, ohne die Datenbank zu treffen. EIN Als Folge davon erhalten Sie möglicherweise eine ObjectNotFoundException später, sobald Sie versuchen, auf den zurückgegebenen Platzhalter zuzugreifen, und erzwingen Sie seine Initialisierung (dies wird auch als Lazy Loading bezeichnet; in späteren Kapiteln wird die Optimierung von load diskutiert.) Die load () - Methode versucht immer. gibt einen Proxy zurück und gibt nur eine initialisierte Objektinstanz zurück, wenn Es wird bereits vom aktuellen Persistenzkontext verwaltet. In dem Beispiel zuvor gezeigt, tritt überhaupt kein Datenbankhit auf! Die Methode get ()) Gibt jedoch niemals einen Proxy zurück, er trifft immer auf die Datenbank.

Sie fragen sich vielleicht, warum diese Option nützlich ist. Schließlich rufen Sie ein .__ ab. Objekt, um darauf zuzugreifen. Es ist üblich, eine permanente Instanz für .__ zu erhalten. Weisen Sie es als Referenz auf eine andere Instanz zu. Stellen Sie sich zum Beispiel vor dass Sie den Artikel nur für einen einzigen Zweck benötigen: um ein .__ einzustellen. Verknüpfung mit einem Kommentar: aComment.setForAuction (item). Wenn das ist Alles, was Sie mit dem Artikel tun möchten, reicht ein Stellvertreter aus. es gibt kein müssen die Datenbank treffen. Mit anderen Worten, wenn der Kommentar gespeichert ist, Sie benötigen den Fremdschlüsselwert eines Artikels, der in COMMENT .__ eingefügt wurde. Tabelle. Der Proxy eines Elements bietet genau das: einen Bezeichnerwert eingepackt in einen Platzhalter, der wie eine echte Sache aussieht.

30
Dmitry Sobolev

load gibt ein Proxy-Objekt zurück.

get gibt ein tatsächliches Objekt zurück und gibt null zurück, wenn kein Objekt gefunden wird.

5
GuruKulki

A: Dies wird in der Referenz zum Ruhezustand erklärt. Ein Unterschied war die Leistung, und der andere ist, dass beim Laden eine nicht wiederherstellbare Ausnahme ausgelöst wird, wenn für die ID kein Objekt gefunden wird.

Weitere Details hier

4
Antonio
  • Verwenden Sie get (), wenn Sie ein Objekt laden möchten
  • Verwenden Sie load (), wenn Sie einen Verweis auf das Objekt abrufen müssen, ohne dass Zusätzliche SQL-Abfragen ausgibt, um beispielsweise eine Beziehung mit Einem anderen Objekt zu erstellen:

Ex: wenn Sie versuchen, ein Empoyee-Objekt mit Empid = 20 zu laden. Es wird jedoch davon ausgegangen, dass der Datensatz nicht in der DB verfügbar ist.

 Employee employee1 = session.load(Employee.class,20);  //Step-1
 system.out.println(employee1.getEmployeeId();       //Step-2  --o/p=20
 system.out.println(employee1.getEmployeeName();       //Step-3 -->O/P:ObjectNotFoundException

Wenn Sie in Schritt-1-Ruhezustand laden verwenden, wird in diesem Moment keine Auswahlabfrage ausgelöst, um den Mitarbeiterdatensatz von der Datenbank abzurufen. Dieses Dummy-Objekt enthält nichts. es ist neuer Angestellter (20). Sie können dies in Schritt 2 überprüfen Es wird 20 gedruckt. In Schritt 3 versuchen wir jedoch, Mitarbeiterinformationen zu finden. Der Winterschlaf löst also zu diesem Zeitpunkt eine SQL-Abfrage aus, um das Empoyee-Objekt abzurufen. Wenn es nicht in DB.throws ObjectNotFoundException gefunden wird.

Employee employee2 = session.get(Employee.class,20);  //Step-4

für session.get () hibernate wird eine SQL-Abfrage ausgelöst, um die Daten aus DB zu holen. In unserem Fall existiert also keine id = 20 in der DB. so wird es null zurückgeben.

3
Satya

Wenn Load aufgerufen wird, wird ein Proxy-Objekt zurückgegeben. Die tatsächliche Auswahlabfrage wird immer noch nicht ausgelöst. Wenn wir zum ersten Mal eine der zugeordneten Eigenschaften verwenden, wird die tatsächliche Abfrage ausgelöst. Wenn die Zeile nicht in der Datenbank vorhanden ist, wird eine Ausnahme ausgelöst. z.B.

Software sw = ( Software )session.load(Software.class, 12);

Hier ist sw vom Proxy-Typ. Die Auswahlabfrage wird noch nicht aufgerufen. Im Eclipse-Debugger sehen Sie es vielleicht wie

sw Software$$EnhancerByCGLIB$$baf24ae0  (id=17) 
   CGLIB$BOUND         true 
   CGLIB$CALLBACK_0 CGLIBLazyInitializer  (id=23)   
   CGLIB$CALLBACK_1 null    
   CGLIB$CONSTRUCTED    true    
   id                  null 
   prop1               null 
   softwareprop        null 

wenn ich benutze

 sw.getProp1()

die Auswahlabfrage wird ausgelöst. Und jetzt kennt der Proxy Werte für alle zugeordneten Eigenschaften. 

Wenn get aufgerufen wird, wird die Auswahlabfrage sofort ausgelöst. Das zurückgegebene Objekt ist kein Proxy, sondern eine tatsächliche Klasse. z.B.

Software sw = ( Software )session.get(Software.class, 12);

Hier ist sw vom Typ Software. Wenn Zeile vorhanden ist, werden alle zugeordneten Eigenschaften mit den Werten in DB gefüllt. Wenn die Zeile nicht existiert, ist sw null.

sw  Software  (id=17)   
id  Integer  (id=20)    
prop1   "prodjlt1" (id=23)  
softwareprop    "softwrjlt1" (id=27)    

Verwenden Sie also, wie immer gesagt, load nur, wenn Sie sicher sind, dass ein Datensatz in der DB vorhanden ist. In diesem Fall ist es harmlos, mit dem Proxy zu arbeiten, und es ist hilfreich, die DB-Abfrage so lange zu verzögern, bis die zugeordnete Eigenschaft tatsächlich benötigt wird. 

2
Kaushik Lele

Die Leistungsprobleme sind auch ein großer Unterschied zwischen Get- und Load-Methode.

Die Methode get () ruft Daten ab, sobald sie ausgeführt wird, während die Methode load () ein Proxy-Objekt zurückgibt, und holt nur Daten, wenn Objekteigenschaften erforderlich sind. Damit die Methode load () eine bessere Leistung erzielt, weil sie das langsame Laden unterstützt . Wir sollten die load () -Methode nur verwenden, wenn wir wissen, dass Daten vorhanden sind, da dies eine Ausnahme auslöst, wenn keine Daten gefunden werden ..__ Wenn wir sicherstellen möchten, dass Daten vorhanden sind, sollten wir die get () -Methode verwenden.

Kurz gesagt, Sie sollten den Unterschied zwischen den beiden verstehen und entscheiden, welche Methode in Ihrer Anwendung am besten geeignet ist. 

Ich fand diese Unterschiede im Tutorial Unterschied zwischen get- und load-Methode in Hibernate

2
David Pham

session.load () : Es wird immer ein Proxy-Objekt mit dem angegebenen Identitätswert zurückgegeben, selbst wenn der Identitätswert nicht in der Datenbank vorhanden ist. Wenn Sie jedoch versuchen, einen Proxy durch Abrufen seiner Eigenschaften aus der Datenbank zu initialisieren, schlägt die Select-Anweisung die Datenbank an. Wenn keine Zeile gefunden wird, wird eine ObjectNotFoundException ausgelöst.

session.get () : Es wird immer null zurückgegeben, wenn der Identitätswert nicht in der Datenbank gefunden wird.

1

Get () gibt das Objekt zurück, indem es aus der Datenbank oder aus dem Ruhezustand-Cache abgerufen wird, wohingegen load () nur die Referenz eines Objekts zurückgibt, das möglicherweise nicht tatsächlich vorhanden ist. Es lädt die Daten nur aus der Datenbank oder aus dem Cache, wenn Sie auf andere Eigenschaften des Objekts zugreifen.

Mit load () können wir die ID drucken, aber sobald wir versuchen, auf andere Felder zuzugreifen, wird die Datenbankabfrage ausgelöst und org.hibernate.ObjectNotFoundException ausgelöst, wenn mit dem angegebenen Bezeichner kein Datensatz gefunden wird. Es handelt sich um den Ruhezustand einer bestimmten Laufzeitausnahme, sodass wir sie nicht explizit erkennen müssen.

0
Vicky