Hibernate Session: Unterschiede zwischen get() und load() mit Beispielen

Hibernate-Session bietet verschiedene Methoden, um Daten aus der Datenbank abzurufen. Zwei davon sind get() und load(). Es gibt auch viele überladene Methoden dafür, die wir unter verschiedenen Umständen verwenden können. Auf den ersten Blick scheinen get() und load() ähnlich zu sein, da beide Daten aus der Datenbank abrufen. Es gibt jedoch einige Unterschiede zwischen ihnen. Schauen wir uns diese mit einem einfachen Beispiel an.

Code-Beispiel

Im folgenden Codebeispiel demonstrieren wir die Verwendung der Methoden get() und load(). Beide Methoden greifen auf Daten in der Datenbank zu, jedoch auf unterschiedliche Weise:

package com.journaldev.hibernate.main;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateGetVsLoad {

    public static void main(String[] args) {
        
        //Vorbereitung
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        
        //Get-Beispiel
        Employee emp = (Employee) session.get(Employee.class, new Long(2));
        System.out.println("Employee get aufgerufen");
        System.out.println("Employee ID= " + emp.getId());
        System.out.println("Employee Get Details:: " + emp + "\n");
        
        //Load-Beispiel
        Employee emp1 = (Employee) session.load(Employee.class, new Long(1));
        System.out.println("Employee load aufgerufen");
        System.out.println("Employee ID= " + emp1.getId());
        System.out.println("Employee load Details:: " + emp1 + "\n");
        
        //Ressourcen schließen
        tx.commit();
        sessionFactory.close();
    }
}

Ausgabe

Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee get aufgerufen
Employee ID= 2
Employee Get Details:: Id= 2, Name= David, Salary= 200.0, {Address= AddressLine1= Arques Ave, City=Santa Clara, Zipcode=95051}

Employee load aufgerufen
Employee ID= 1
Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee load Details:: Id= 1, Name= Pankaj, Salary= 100.0, {Address= AddressLine1= Albany Dr, City=San Jose, Zipcode=95129}

Verhalten bei nicht vorhandenen Daten

Aus der Ausgabe wird deutlich, dass get() das Objekt durch Abrufen aus der Datenbank oder dem Hibernate-Cache zurückgibt, während load() nur die Referenz eines Objekts zurückgibt, das möglicherweise nicht existiert. Es lädt die Daten aus der Datenbank oder dem Cache erst, wenn Sie auf andere Eigenschaften des Objekts zugreifen. Versuchen wir nun, Daten abzurufen, die in der Datenbank nicht existieren.

Code-Beispiel

Das nächste Codebeispiel zeigt, wie die Methoden get() und load() auf Daten reagieren, die nicht in der Datenbank vorhanden sind. get() gibt null zurück, während load() eine Ausnahme auslöst, wenn auf nicht vorhandene Daten zugegriffen wird:

//Get-Beispiel
try {
    Employee emp = (Employee) session.get(Employee.class, new Long(200));
    System.out.println("Employee get aufgerufen");
    if (emp != null) {
        System.out.println("Employee GET ID= " + emp.getId());
        System.out.println("Employee Get Details:: " + emp + "\n");
    }
} catch (Exception e) {
    e.printStackTrace();
}

//Load-Beispiel
try {
    Employee emp1 = (Employee) session.load(Employee.class, new Long(100));
    System.out.println("Employee load aufgerufen");
    System.out.println("Employee LOAD ID= " + emp1.getId());
    System.out.println("Employee load Details:: " + emp1 + "\n");
} catch (Exception e) {
    e.printStackTrace();
}

Ausgabe

Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
Employee get aufgerufen
Employee load aufgerufen
Employee LOAD ID= 100
Hibernate: select employee0_.emp_id as emp_id1_1_0_, employee0_.emp_name as emp_name2_1_0_, employee0_.emp_salary as emp_sala3_1_0_, address1_.emp_id as emp_id1_0_1_, address1_.address_line1 as address_2_0_1_, address1_.city as city3_0_1_, address1_.zipcode as zipcode4_0_1_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.journaldev.hibernate.model.Employee#100]
	at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253)
	at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
	at com.journaldev.hibernate.model.Employee_$$_jvst407_1.toString(Employee_$$_jvst407_1.java)
	at java.lang.String.valueOf(String.java:2847)
	at java.lang.StringBuilder.append(StringBuilder.java:128)
	at com.journaldev.hibernate.main.HibernateExample.main(HibernateExample.java:36)

Zusammenfassung von Hibernate Session: Unterschiede zwischen get() und load()

  • get() lädt die Daten sofort, während load() ein Proxy-Objekt zurückgibt und die Daten nur dann lädt, wenn sie tatsächlich benötigt werden. Daher unterstützt load() Lazy Loading.
  • Da load() eine Ausnahme wirft, wenn keine Daten gefunden werden, sollte es nur verwendet werden, wenn bekannt ist, dass die Daten existieren.
  • Wir sollten get() verwenden, wenn wir sicherstellen möchten, dass die Daten in der Datenbank existieren.

Das war alles zu den Hibernate-Methoden get() und load(). Beide Methoden bieten unterschiedliche Ansätze zum Abrufen von Daten aus der Datenbank und sollten je nach Szenario ausgewählt werden. Verwenden Sie get(), wenn Sie sicherstellen möchten, dass die Daten tatsächlich existieren, und load(), wenn Sie von der Lazy-Loading-Funktionalität profitieren möchten. Das Verständnis der Unterschiede hilft dabei, effizientere und zuverlässigere Anwendungen zu entwickeln. Ich hoffe, dieser Leitfaden klärt einige Ihrer Fragen und unterstützt Sie bei der richtigen Auswahl der Methode für Ihre Anforderungen.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren:

centron Managed Cloud Hosting in Deutschland

Java-Array: So prüfst du Werte effizient

JavaScript
Wie prüft man, ob ein Java Array einen Wert enthält? Es gibt viele Möglichkeiten, um zu überprüfen, ob ein Java Array einen bestimmten Wert enthält. Einfache Iteration mit einer for-Schleife…
centron Managed Cloud Hosting in Deutschland

Wie berechnet man den BLEU-Score in Python?

Python
Wie berechnet man den BLEU-Score in Python? Der BLEU-Score in Python ist eine Metrik, die die Güte von maschinellen Übersetzungsmodellen misst. Ursprünglich wurde er nur für Übersetzungsmodelle entwickelt, wird jedoch…