Поиск по сайту:

Hibernate SessionFactory


Hibernate SessionFactory — это фабричный класс, через который мы получаем сеансы и выполняем операции с базой данных.

Hibernate SessionFactory

Hibernate SessionFactory getCurrentSession

Метод Hibernate SessionFactory getCurrentSession() возвращает сеанс, привязанный к контексту. Но чтобы это работало, нам нужно настроить его в файле конфигурации гибернации, как показано ниже.

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

Если он не настроен на поток, мы получим исключение ниже.

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)

Поскольку этот объект сеанса принадлежит контексту гибернации, нам не нужно его закрывать. Как только фабрика сеансов закрывается, этот объект сеанса закрывается. Объекты Hibernate Session не являются потокобезопасными, поэтому мы не должны использовать их в многопоточной среде. Мы можем использовать его в однопоточной среде, потому что это относительно быстрее, чем открытие нового сеанса.

Hibernate SessionFactory openSession

Метод Hibernate SessionFactory openSession() всегда открывает новый сеанс. Мы должны закрыть этот объект сеанса, как только мы закончим все операции с базой данных. Мы должны открывать новую сессию для каждого запроса в многопоточной среде. Для фреймворков веб-приложений мы можем выбрать открытие нового сеанса для каждого запроса или для каждого сеанса в зависимости от требований.

Hibernate SessionFactory openStatelessSession

Метод Hibernate SessionFactory openStatelessSession() возвращает экземпляр StatelessSession. Существует еще один перегруженный метод, в котором мы можем передать объект java.sql.Connection, чтобы получить объект сеанса без сохранения состояния из спящего режима. StatelessSession в Hibernate не реализует кеш первого уровня и не взаимодействует с каким-либо кешем второго уровня. Поскольку он не имеет состояния, он не реализует транзакционную отложенную запись или автоматическую грязную проверку или не выполняет каскадные операции со связанными сущностями. Коллекции также игнорируются сеансом без сохранения состояния. Операции, выполняемые через сеанс без сохранения состояния, обходят модель событий и перехватчики Hibernate. Это больше похоже на обычное соединение JDBC и не дает никаких преимуществ, связанных с использованием спящего режима. Однако сеанс без сохранения состояния может быть уместным в определенных ситуациях. Например, когда мы загружаем объемные данные в базу данных и не хотим, чтобы сеанс гибернации содержал огромные данные в кэш-памяти первого уровня. Ниже приведена простая программа, показывающая использование методов Hibernate SessionFactory.

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();
		
		//Current Session - no need to close
		Session currentSession = sessionFactory.getCurrentSession();
		
		//open new session
		Session newSession = sessionFactory.openSession();
		//perform db operations
		
		//close session
		newSession.close();
		
		//open stateless session
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//perform stateless db operations
		
		//close session
		statelessSession.close();
		
		//close session factory
		sessionFactory.close();
		
	}

}

Это все, что касается SessionFactory в Hibernate и различных методов получения объекта сеанса.