深入理解Hibernate SessionFactory:Java持久化技术核心
Hibernate 的 SessionFactory 是一个工厂类,通过它我们可以获取会话并进行数据库操作。
Hibernate 会话工厂
Hibernate SessionFactory提供了三种方法来获取Session对象 – getCurrentSession()、openSession()和openStatelessSession()。
获取Hibernate的SessionFactory的当前会话
在Hibernate中,getCurrentSession()方法返回与上下文绑定的会话。但是为了使其正常工作,我们需要在Hibernate配置文件中进行配置,如下所示。
<property name="hibernate.current_session_context_class">thread</property>
如果没有配置为线程,则会出现以下异常。
线程"main"中出现异常 org.hibernate.HibernateException: 没有配置CurrentSessionContext!
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
at com.Olivia.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)
由于此会话对象属于Hibernate上下文,我们不需要手动关闭它。一旦会话工厂关闭,此会话对象也会自动关闭。Hibernate会话对象不是线程安全的,因此我们不应在多线程环境中使用它。我们可以在单线程环境中使用它,因为与打开新会话相比,它的性能相对更快。
打开 Hibernate SessionFactory 的会话
Hibernate的openSession()方法总是打开一个新的会话。在完成所有数据库操作后,我们应该关闭这个会话对象。在多线程环境中,我们应该为每个请求打开一个新的会话。对于Web应用程序框架,根据需求,我们可以选择为每个请求或每个会话打开一个新的会话。
打开无状态Hibernate SessionFactory的会话
Hibernate的openStatelessSession()方法返回StatelessSession的实例。还有一个重载的方法,我们可以传递java.sql.Connection对象来从Hibernate获取一个无状态会话对象。在Hibernate中,无状态会话不实现一级缓存,也不与任何二级缓存进行交互。由于它是无状态的,它不实现事务写回、自动脏检查或对关联实体的级联操作。无状态会话也忽略了集合。通过无状态会话执行的操作会绕过Hibernate的事件模型和拦截器。它更像是一个普通的JDBC连接,不提供使用Hibernate框架所带来的任何额外好处。然而,在某些情况下,无状态会话可能是一个很好的选择。例如,在向数据库加载大量数据时,我们不希望Hibernate会话在一级缓存中保存大量数据。下面是一个展示Hibernate SessionFactory方法使用的简单程序。
package com.Olivia.hibernate.main;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import com.Olivia.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();
//关闭会话工厂
sessionFactory.close();
}
}
这就是Hibernate中SessionFactory的全部内容,以及获取会话对象的不同方法。