Hibernate SessionFactory
Hibernate SessionFactory ist die Factory-Klasse, über die wir Sitzungen erhalten und Datenbankoperationen durchführen können.
Die Hibernate SessionFactory
Hibernate SessionFactory stellt drei Methoden bereit, mit denen wir ein Session-Objekt erhalten können: getCurrentSession()
, openSession()
und openStatelessSession()
.
Hibernate getCurrentSession
Die Methode Hibernate SessionFactory getCurrentSession()
gibt die an den Kontext gebundene Sitzung zurück. Damit dies funktioniert, müssen wir dies in der Hibernate-Konfigurationsdatei wie unten gezeigt konfigurieren:
<property name="hibernate.current_session_context_class">thread</property>
Wenn dies nicht auf thread
konfiguriert ist, erhalten wir die folgende Ausnahme:
Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
at com.journaldev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)
Da dieses Sitzungsobjekt zum Hibernate-Kontext gehört, müssen wir es nicht schließen. Sobald die SessionFactory geschlossen wird, wird dieses Sitzungsobjekt ebenfalls geschlossen. Hibernate-Sitzungsobjekte sind nicht threadsicher, daher sollten wir sie nicht in einer Multi-Thread-Umgebung verwenden. In einer Single-Thread-Umgebung können sie jedoch verwendet werden, da sie schneller sind als das Öffnen einer neuen Sitzung.
Hibernate SessionFactory openSession
Die Methode Hibernate SessionFactory openSession()
öffnet immer eine neue Sitzung. Wir sollten dieses Sitzungsobjekt schließen, sobald alle Datenbankoperationen abgeschlossen sind. In einer Multi-Thread-Umgebung sollten wir für jede Anfrage eine neue Sitzung öffnen. Für Webanwendungsframeworks können wir je nach Bedarf wählen, ob wir für jede Anfrage oder für jede Sitzung eine neue Sitzung öffnen möchten.
Hibernate openStatelessSession
Die Methode Hibernate SessionFactory openStatelessSession()
gibt eine Instanz von StatelessSession
zurück. Es gibt eine weitere überladene Methode, bei der wir ein java.sql.Connection
-Objekt übergeben können, um ein Stateless-Session-Objekt von Hibernate zu erhalten. StatelessSession in Hibernate implementiert keinen First-Level-Cache und interagiert nicht mit einem Second-Level-Cache. Da sie zustandslos ist, implementiert sie keine Transaktions-Schreibvorgänge, keine automatische Dirty-Checking oder kaskadierende Operationen zu zugehörigen Entitäten. Collections werden von einer Stateless-Session ebenfalls ignoriert. Über eine Stateless-Session durchgeführte Operationen umgehen das Ereignismodell und die Interceptoren von Hibernate. Sie ähnelt eher einer normalen JDBC-Verbindung und bietet keine Vorteile, die durch die Verwendung des Hibernate-Frameworks entstehen.
In bestimmten Situationen kann eine Stateless-Session jedoch eine gute Wahl sein. Beispielsweise, wenn wir Massendaten in eine Datenbank laden und nicht möchten, dass die Hibernate-Session große Daten im First-Level-Cache speichert. Ein einfaches Programm, das die Verwendung der Hibernate SessionFactory-Methoden zeigt, ist unten angegeben:
package com.journaldev.hibernate.main;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import com.journaldev.hibernate.util.HibernateUtil;
public class HibernateSessionExample {
public static void main(String[] args) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// Aktuelle Sitzung - muss nicht geschlossen werden
Session currentSession = sessionFactory.getCurrentSession();
// Neue Sitzung öffnen
Session newSession = sessionFactory.openSession();
// Datenbankoperationen durchführen
// Sitzung schließen
newSession.close();
// Stateless-Session öffnen
StatelessSession statelessSession = sessionFactory.openStatelessSession();
// Zustandslose Datenbankoperationen durchführen
// Sitzung schließen
statelessSession.close();
// SessionFactory schließen
sessionFactory.close();
}
}
Das ist alles zur SessionFactory in Hibernate und ihren verschiedenen Methoden, um Sitzungsobjekte zu erhalten.
Fazit
Hibernate SessionFactory ist ein leistungsstarkes Tool zur Verwaltung von Datenbanksitzungen. Durch das Verständnis der Unterschiede zwischen getCurrentSession()
, openSession()
und openStatelessSession()
können Entwickler den richtigen Ansatz basierend auf den Anforderungen ihrer Anwendung wählen und sowohl Leistung als auch Skalierbarkeit sicherstellen.