Hibernate中session管理

尽管让程序自主管理 Session 对象的生命周期也是可行的, 但是在实际 Java 应用中, 把管理 Session 对象的生命周期交给 Hibernate 管理, 可以简化 Java 应用程序代码和软件架构。

Hibernate 3 自身提供了三种管理 Session 对象的方法:

  • Session 对象的生命周期与本地线程绑定

  • Session 对象的生命周期与 JTA 事务绑定

  • Hibernate 委托程序管理 Session 对象的生命周期

在 Hibernate 的核心配置文件中,hibernate.current_session_context_class 属性用于指定 Session 管理方式, 可选值包括:

  • thread: Session 对象的生命周期与本地线程绑定

  • jta*: Session 对象的生命周期与 JTA 事务绑定

  • managed: Hibernate 委托程序来管理 Session 对象的生命周期

推荐将session的生命周期与本地线程绑定:

如果把 Hibernate 配置文件的 hibernate.current_session_context_class 属性值设为 thread, Hibernate 就会按照与本地线程绑定的方式来管理 Session

Hibernate 按以下规则把 Session 与本地线程绑定:

  • 当一个线程(threadA)第一次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法会创建一个新的 Session(sessionA) 对象, 把该对象与 threadA 绑定, 并将 sessionA 返回

  • 当 threadA 再次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法将返回 sessionA 对象

  • 当 threadA 提交 sessionA 对象关联的事务时, Hibernate 会自动清理 sessionA 对象的缓存, 然后提交事务, 关闭 sessionA 对象. 当 threadA 撤销 sessionA 对象关联的事务时, 也会自动关闭 sessionA 对象

  • 若 threadA 再次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法会又创建一个新的 Session(sessionB) 对象, 把该对象与 threadB绑定, 并将 sessionB 返回

<!--配置将session与当前线程进行绑定-->
<property name="hibernate.current_session_context_class">thread</property>

Demo:

public class GetSessionByThread {

public static void main(String[] args) {

Configuration configure = new Configuration().configure();
//获取session工厂
SessionFactory sessionFactory = configure.buildSessionFactory();

Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();

System.out.println(session1==session2);
}
}

运行结果:

证明拿到了同一个session,如果将session与当前线程进行绑定,那么session不需要手动关闭(session就不用close()!),当线程销毁的时候,会自动关闭session

猜你喜欢

转载自blog.csdn.net/weixin_42719412/article/details/83414604