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 и различных методов получения объекта сеанса.