Hibernate和Spring集成过程中Session的问题

getCurrentSession()与openSession()
getCurrentSession()与openSession()方法通过Hibernate的SessionFactory获得,两者的区别网上有很多文章已经介绍过,即:

Java代码   收藏代码
  1. ①getCurrentSession创建的session会和绑定到当前线程,而openSession不会。   
  2. ②getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭  



对于getCurrentSession()方法:
        (1)其所在方法必须进行事务控制
        (2)Session在第一次被使用的时候,或者第一次调用getCurrentSession()的时候,其生命周期就开始。然后它被 Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate也会把Session从当前线程剥离,并且关闭它。假若你 再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元。    
  
对于openSession()方法:
         这个方法一般在spring与Hibernate的集成中不直接使用,它就是打开一个session,并且这个session与上下文无关,如果对其所在 方法进行事务控制,会发现不起作用,原因就是前面提到的,事务控制必须确保是同一个连接,而openSession()打开的session与上下文无 关。这个方法与getSession(),getCurrentSession()以及getHibernateTemplate()等方法的区别在于: 后面的几个方法spring可以对其进行控制,如果对它们所在的方法进行事务控制,spring可以确保是同一个连接,而openSession()方 法,spring无法对其进行控制,所以事务也不会起作用。

猜你喜欢

转载自jenoxu.iteye.com/blog/1104212
今日推荐