Hibernate SessionFactory

De Hibernate SessionFactory is de fabrieksklasse waarmee we sessies kunnen verkrijgen en databasebewerkingen kunnen uitvoeren.

Hibernate SessionFactory

De Hibernate SessionFactory biedt drie methoden waarmee we een Session-object kunnen verkrijgen – getCurrentSession(), openSession() en openStatelessSession().

Hibernate SessionFactory getCurrentSession

De getCurrentSession()-methode van de Hibernate SessionFactory retourneert de sessie die aan de context is gebonden. Maar hiervoor moeten we het configureren in het hibernate configuratiebestand zoals hieronder.

<property name="hibernate.current_session_context_class">thread</property>

Als het niet is geconfigureerd voor threading, krijgen we de onderstaande uitzondering.

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)

Omdat dit sessieobject tot de hibernate-context behoort, hoeven we het niet te sluiten. Zodra de sessiefabriek is gesloten, wordt dit sessieobject gesloten. Hibernate Session-objecten zijn niet thread-safe, dus we moeten het niet gebruiken in een multi-threaded omgeving. In een single-threaded omgeving kunnen we het wel gebruiken omdat het relatief sneller is dan het openen van een nieuwe sessie.

Hibernate SessionFactory openSession

Hibernate SessionFactory openSession() methode opent altijd een nieuwe sessie. We moeten dit sessieobject sluiten zodra we klaar zijn met alle databasebewerkingen. Voor elk verzoek in een multi-threaded omgeving moeten we een nieuwe sessie openen. Voor webapplicatiekaders kunnen we ervoor kiezen om voor elk verzoek of voor elke sessie een nieuwe sessie te openen op basis van de vereisten.

Hibernate SessionFactory openStatelessSession

De SessionFactory openStatelessSession() methode van Hibernate retourneert een instantie van StatelessSession. Er is nog een andere overloaded methode waarbij we een java.sql.Connection-object kunnen doorgeven om een stateless session object te verkrijgen van Hibernate. Een StatelessSession in Hibernate implementeert geen first-level cache en heeft geen interactie met een tweede-level cache. Aangezien het stateless is, implementeert het geen transactional write-behind of automatische dirty checking, noch voert het cascading operations uit naar geassocieerde entiteiten. Collecties worden ook genegeerd door een stateless session. Operaties uitgevoerd via een stateless session omzeilen het gebeurtenismodel en interceptors van Hibernate. Het is meer zoals een normale JDBC-verbinding en biedt geen voordelen die voortvloeien uit het gebruik van het hibernate-framework. Desalniettemin kan een stateless session goed passen in bepaalde situaties. Bijvoorbeeld waar we bulkgegevens in de database laden en we niet willen dat de Hibernate-sessie enorme gegevens in het cachegeheugen van de first-level vasthoudt. Een eenvoudig programma dat het gebruik van Hibernate SessionFactory-methoden toont, wordt hieronder gegeven.

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();
		
		//Huidige sessie - hoeft niet te worden gesloten
		Session currentSession = sessionFactory.getCurrentSession();
		
		//nieuwe sessie openen
		Session newSession = sessionFactory.openSession();
		//db-operaties uitvoeren
		
		//sessie sluiten
		newSession.close();
		
		//stateless sessie openen
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//stateless db-operaties uitvoeren
		
		//sessie sluiten
		statelessSession.close();
		
		//sessie sluiten factory
		sessionFactory.close();
		
	}

}

Dat is alles voor SessionFactory in Hibernate en de verschillende methoden om sessie-objecten te verkrijgen.

Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory