引用:忘了
首先是getCurrentSession()与openSession()的区别:
1、getCurrentSession()与openSession()的区别?
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
openSession() 与 getCurrentSession() 有何不同和关联呢?
在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。
那么当使用getCurrentSession()方法时报No Hibernate Session bound to thread问题该怎么办呢?(引用自http://www.cnblogs.com/ylhssn/p/5181149.html)
1、getCurrentSession()是必须提交事务的。所以在用到session.getCurrentSession()的这个方法一定是要配置声明式事务管理。
2、openSession()恰恰是与以上的方法想法,它不需要提交事务。但是他的资源必须手动关闭。
所以针对“No Hibernate Session bound to thread”异常的解决方案有两个:
方案一:将getCurrentSession()改为openSession()。
方案二:在sessionFactory bean中的hibernateProperties项中配置以下信息:
1 <prop key="hibernate.current_session_context_class">
2 thread
3 </prop>
4 <prop key="hibernate.transaction.factory_class">
5 org.hibernate.transaction.JDBCTransactionFactory
6 </prop>
在sessionFactory bean中添加以上两条配置信息后,再次运行程序,又报异常!
org.hibernate.HibernateException: createCriteria is not valid without active transaction
已知使用getCurrentSession()方法是必须提交事务的,而在SSH框架中是使用spring配置声明式事务管理的。
那接下来再次复习一下spring配置声明式事务管理知识,以便查找错误。
spring配置声明式事务管理
此处知识回顾引自“一个无聊的人”的“Spring声明式事务配置管理方法”,博主讲的很详细,推荐一看, 传送门
以下是博文内容截图:
除此之外还可以使用其他几种方式用spring管理事务,请自行查找资料学习。
仔细核对项目中的配置信息后,确定事务已配置无误,当前异常信息还是未解决,继续找资料,最终在“如果你报createSQLQuery is not valid without active transaction,请看这里”一文中找到解决方式:
将hibernate.current_session_context_class的值由Thread改为org.springframework.orm.hibernate2.SpringSessionContext
至此由使用getCurrentSession()方法引发的异常问题解决!