SessionFactory di Hibernate

Hibernate SessionFactory

La SessionFactory di Hibernate è la classe factory attraverso la quale otteniamo sessioni e eseguiamo operazioni sul database.

Hibernate SessionFactory getCurrentSession

La SessionFactory di Hibernate fornisce tre metodi attraverso i quali possiamo ottenere l’oggetto Session – getCurrentSession(), openSession() e openStatelessSession().

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

La SessionFactory di Hibernate getCurrentSession() restituisce la sessione legata al contesto. Ma affinché ciò funzioni, è necessario configurarlo nel file di configurazione di Hibernate come mostrato di seguito.Se non è configurato per il thread, otterremo l’eccezione seguente.

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)

Poiché questo oggetto sessione appartiene al contesto di Hibernate, non è necessario chiuderlo. Una volta chiusa la session factory, questo oggetto sessione viene chiuso. Gli oggetti Session di Hibernate non sono thread-safe, quindi non dovremmo usarli in un ambiente multi-threaded. Possiamo utilizzarli in un ambiente single-threaded poiché è relativamente più veloce rispetto all’apertura di una nuova sessione.

Hibernate SessionFactory openSession

Il metodo openSession() di Hibernate SessionFactory apre sempre una nuova sessione. Dovremmo chiudere questo oggetto sessione una volta completate tutte le operazioni sul database. Dovremmo aprire una nuova sessione per ogni richiesta in un ambiente multi-threaded. Per i framework di applicazioni web, possiamo scegliere di aprire una nuova sessione per ogni richiesta o per ogni sessione in base ai requisiti.

Hibernate SessionFactory openStatelessSession

Hibernate il metodo \texttt{openStatelessSession()} della \texttt{SessionFactory} restituisce un’istanza di \texttt{StatelessSession}. Esiste un altro metodo sovraccaricato in cui possiamo passare un oggetto \texttt{java.sql.Connection} per ottenere un oggetto sessione senza stato da Hibernate. \texttt{StatelessSession} in Hibernate non implementa la cache di primo livello e non interagisce con alcuna cache di secondo livello. Poiché è senza stato, non implementa la scrittura in background transazionale o il controllo sporco automatico o esegue operazioni di cascata su entità associate. Le collezioni sono anche ignorate da una sessione senza stato. Le operazioni eseguite tramite una sessione senza stato ignorano il modello di eventi e gli intercettori di Hibernate. È più simile a una normale connessione JDBC e non fornisce vantaggi derivanti dall’uso del framework Hibernate. Tuttavia, la sessione senza stato può essere adatta in determinate situazioni. Ad esempio, quando stiamo caricando dati in blocco nel database e non vogliamo che la sessione Hibernate tenga enormi quantità di dati nella memoria della cache di primo livello. Un semplice programma che mostra l’uso dei metodi della SessionFactory di Hibernate è riportato di seguito.

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();
		
		//Sessione corrente - non è necessario chiudere
		Session currentSession = sessionFactory.getCurrentSession();
		
		//apri nuova sessione
		Session newSession = sessionFactory.openSession();
		//esegui operazioni sul database
		
		//chiudi sessione
		newSession.close();
		
		//apri sessione senza stato
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//esegui operazioni sul database senza stato
		
		//chiudi sessione
		statelessSession.close();
		
		//chiudi sessione factory
		sessionFactory.close();
		
	}

}

Questo è tutto per la SessionFactory in Hibernate e i suoi diversi metodi per ottenere l’oggetto sessione.

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