Hibernate SessionFactory 是一個工廠類別,透過它我們可以取得 Session 並執行資料庫操作。
Hibernate SessionFactory
Hibernate SessionFactory 提供了三個方法,透過這些方法我們可以取得 Session 物件 –
getCurrentSession()
、openSession()
和 openStatelessSession()
。
Hibernate SessionFactory getCurrentSession
Hibernate SessionFactory
的 getCurrentSession() 方法會返回與上下文綁定的 Session。但是,為了使其正常工作,我們需要在 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)
由於此session物件屬於hibernate上下文,我們不需要關閉它。一旦session工廠關閉,此session物件也會被關閉。Hibernate的Session物件不是線程安全的,因此在多線程環境中不應該使用它。我們可以在單線程環境中使用它,因為相對於開啟新的session,它的速度較快。
Hibernate SessionFactory openSession
Hibernate SessionFactory
的openSession()方法總是打開一個新的session。我們應該在完成所有數據庫操作後關閉此session物件。在多線程環境中,我們應該為每個請求打開一個新的session。對於Web應用程序框架,我們可以根據需求選擇為每個請求或每個session打開一個新的session。
Hibernate SessionFactory openStatelessSession
Hibernate SessionFactory
的 openStatelessSession() 方法返回 StatelessSession
的实例。还有另一个重载方法,可以传递 java.sql.Connection
对象来从 Hibernate 获取无状态会话对象。Hibernate 中的 StatelessSession 不实现一级缓存,也不与任何二级缓存交互。由于它是无状态的,它不实现事务性的写入后处理、自动脏检查或级联操作到关联实体。无状态会话也忽略了集合。通过无状态会话执行的操作绕过了 Hibernate 的事件模型和拦截器。它更像是一个普通的 JDBC 连接,并且不提供使用 Hibernate 框架所带来的任何优势。然而,在某些情况下,无状态会话可能是一个很好的选择。例如,在将大量数据加载到数据库中时,我们不希望 Hibernate 会话在一级缓存中保存大量数据。下面是一个展示 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();
//当前会话 - 无需关闭
Session currentSession = sessionFactory.getCurrentSession();
//打开新会话
Session newSession = sessionFactory.openSession();
//执行数据库操作
//关闭会话
newSession.close();
//打开无状态会话
StatelessSession statelessSession = sessionFactory.openStatelessSession();
//执行无状态数据库操作
//关闭会话
statelessSession.close();
//关闭会话 factory
sessionFactory.close();
}
}
关于 Hibernate 的 SessionFactory 以及获取会话对象的不同方法就介绍到这里。
Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory