Tutorials  /  Java

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

Ccentron Redaktion · Dezember 2024 ·3 Min. Lesezeit ·Java, Tutorial

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:

Go
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();
    }
}
VM

Passende Infrastruktur bei centron

Java-Anwendungen im Dauerbetrieb: ccloud³ VMs ab 3,12 € im Monat mit vollem Root-Zugriff, stundengenau abgerechnet. Cloud Server mieten →

Ausgabe

Code
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:

Code
//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

Code
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.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Java
Teilen
Noch offene Fragen?

Unser Team hilft Ihnen bei Ihrem konkreten Setup weiter – von Menschen, die die Plattform selbst betreiben.

War dieses Tutorial hilfreich?

Ihre Antwort wird anonym gespeichert und hilft uns, die Tutorials zu verbessern.

Kommentare

Noch keine Kommentare – stellen Sie die erste Frage zu diesem Tutorial.

Zum Kommentieren anmelden

Kommentare stehen centron-Kunden offen. Melden Sie sich in Ihrem Konto an, um eine Frage zu diesem Tutorial zu stellen.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren