在开发中,通常在业务层进行事物管理,在Dao层操作数据库. 也就是说业务层需要连接(Session)开启事物,Dao层需要连接(Session)操作数据库,如何保证这些连接是同一个呢?
在JDBC阶段,我们通过了两种方式解决:
1.向下传递参数
2.绑定到TreadLocal里面.
在Hibernate中,Session 对象与本地线程绑定很简单,只需要两步:
在hibernate.cfg.xml文件中,添加属性,开启与本地线程绑定的session
<property name="hibernate.current_session_context_class">thread</property>
通过SessionFactory的getCurrentSession()方法获得Session
Session session = sessionFactory.getCurrentSession();
注意:通过getCurrentSession()方法获得的session,无需调用close方法释放资源。当事物提交或者回滚,会自动释放资源.
6.2Session获取方式的区别
调用getCurrentSession()方法时,会判断当前线程中是否绑定了session。
如果绑定了,直接返回线程中绑定的session
如果没有绑定,先去创建一个session,然后讲session存储到当前线程中,再返回。
调用openSession()方法时,只会创建一个新的session,且不会存储到当前线程。
通过getCurrentSession()方法获得的session,无需调用close方法释放资源. 通过openSession()方法获得的session需要手动释放资源