Фабрика сеансов Hibernate
Фабрика сеансов Hibernate предоставляет три метода, с помощью которых мы можем получить объект Session –
getCurrentSession()
, openSession()
и openStatelessSession()
.
Метод getCurrentSession фабрики сеансов Hibernate
Метод getCurrentSession()
фабрики сеансов Hibernate возвращает сеанс, привязанный к контексту. Однако для того, чтобы это работало, нам нужно сконфигурировать его в файле конфигурации Hibernate, как показано ниже.
<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, нам не нужно его закрывать. Как только фабрика сессий закрыта, этот объект сессии также закрывается. Объекты сессии Hibernate не являются потокобезопасными, поэтому мы не должны использовать их в многопоточной среде. Мы можем использовать их в однопоточной среде, потому что это относительно быстрее, чем открытие новой сессии.
Открытие сессии Hibernate SessionFactory
Метод openSession()
фабрики сессий Hibernate всегда открывает новую сессию. Мы должны закрыть этот объект сессии, как только закончим все операции с базой данных. Мы должны открывать новую сессию для каждого запроса в многопоточной среде. Для веб-приложений мы можем выбрать открытие новой сессии для каждого запроса или для каждой сессии в зависимости от требований.
Открытие сессии Hibernate SessionFactory
Метод openStatelessSession()
в классе SessionFactory
в Hibernate возвращает экземпляр класса StatelessSession
. Существует еще один перегруженный метод, в котором мы можем передать объект java.sql.Connection
, чтобы получить объект без состояния из Hibernate. StatelessSession в Hibernate не реализует кэш первого уровня и не взаимодействует с каким-либо кэшем второго уровня. Поскольку он не имеет состояния, он не реализует автоматическую проверку наличия изменений или каскадные операции для связанных сущностей. Коллекции также игнорируются в stateless-сессии. Операции, выполняемые через stateless-сессию, обходят модель событий и перехватчики Hibernate. Это больше похоже на обычное JDBC-соединение и не предоставляет никаких преимуществ, которые дает использование фреймворка Hibernate. Однако stateless-сессия может быть хорошим выбором в определенных ситуациях. Например, когда мы загружаем большие объемы данных в базу данных и не хотим, чтобы сессия Hibernate хранила огромные объемы данных в кэше первого уровня. Приведен простой пример программы, демонстрирующий использование методов SessionFactory в Hibernate.
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();
//Текущая сессия - не нужно закрывать
Session currentSession = sessionFactory.getCurrentSession();
//открыть новую сессию
Session newSession = sessionFactory.openSession();
//выполнить операции с базой данных
//закрыть сессию
newSession.close();
//открыть stateless-сессию
StatelessSession statelessSession = sessionFactory.openStatelessSession();
//выполнить операции с базой данных через stateless-сессию
//закрыть сессию
statelessSession.close();
//закрыть сессию factory
sessionFactory.close();
}
}
Это все, что касается SessionFactory в Hibernate и его различных методов для получения объекта сессии.
Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory