O SessionFactory do Hibernate é a classe de fábrica através da qual obtemos sessões e realizamos operações de banco de dados.
SessionFactory do Hibernate
O SessionFactory do Hibernate fornece três métodos através dos quais podemos obter o objeto Session –
getCurrentSession()
, openSession()
e openStatelessSession()
.
SessionFactory do Hibernate getCurrentSession
O método getCurrentSession()
do SessionFactory
do Hibernate retorna a sessão vinculada ao contexto. Mas para que isso funcione, precisamos configurá-lo no arquivo de configuração do hibernate como abaixo.
<property name="hibernate.current_session_context_class">thread</property>
Se não estiver configurado para thread, então receberemos a exceção abaixo.
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)
Como este objeto de sessão pertence ao contexto do Hibernate, não é necessário fechá-lo. Uma vez que a fábrica de sessões é fechada, este objeto de sessão também é fechado. Objetos de Sessão do Hibernate não são seguros para threads, então não devemos usá-los em um ambiente multi-threaded. Podemos utilizá-los em um ambiente de thread único, pois é relativamente mais rápido do que abrir uma nova sessão.
Hibernate SessionFactory openSession
O método openSession() da SessionFactory
do Hibernate sempre abre uma nova sessão. Devemos fechar este objeto de sessão quando terminarmos todas as operações de banco de dados. Devemos abrir uma nova sessão para cada solicitação em um ambiente multi-threaded. Para frameworks de aplicativos da web, podemos optar por abrir uma nova sessão para cada solicitação ou para cada sessão, dependendo dos requisitos.
Hibernate SessionFactory openStatelessSession
Hibernate O método openStatelessSession() da SessionFactory
retorna uma instância de StatelessSession
. Existe outro método sobrecarregado onde podemos passar um objeto java.sql.Connection
para obter um objeto de sessão sem estado do Hibernate. O StatelessSession no Hibernate não implementa o cache de primeiro nível e não interage com nenhum cache de segundo nível. Como é sem estado, não implementa o write-behind transacional, verificação automática de sujeira ou operações em cascata para entidades associadas. Coleções também são ignoradas por uma sessão sem estado. As operações realizadas por meio de uma sessão sem estado ignoram o modelo de eventos e interceptores do Hibernate. É mais parecido com uma conexão JDBC normal e não fornece nenhum benefício que vem do uso do framework Hibernate. No entanto, a sessão sem estado pode ser adequada em determinadas situações. Por exemplo, quando estamos carregando dados em massa no banco de dados e não queremos que a sessão do Hibernate mantenha dados enormes na memória do cache de primeiro nível. Um programa simples mostrando o uso dos métodos da SessionFactory do Hibernate está abaixo.
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();
//Sessão Atual - não precisa fechar
Session currentSession = sessionFactory.getCurrentSession();
//abrir nova sessão
Session newSession = sessionFactory.openSession();
//realizar operações no banco de dados
//fechar sessão
newSession.close();
//abrir sessão sem estado
StatelessSession statelessSession = sessionFactory.openStatelessSession();
//realizar operações sem estado no banco de dados
//fechar sessão
statelessSession.close();
//fechar sessão factory
sessionFactory.close();
}
}
Isso é tudo sobre SessionFactory no Hibernate e seus diferentes métodos para obter objetos de sessão.
Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory