Hibernate No Session found for current thread异常分析
2016-04-07 18:34
603 查看
今天在开发程序时,发生了一个错误,系统报No Session found for current thread 异常。根据网上搜索的结果,把问题解决了,这里总结一下。
Hibernate中SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,是否自动创建新的取决于CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的currentSession()方法来获得Session。在Spring中,如果我们在没有配置TransactionManager并且没有事先调用SessionFactory.openSession()的情况直接调用getCurrentSession(),那么程序将抛出“No
Session found for current thread”异常。如果配置了TranactionManager并且通过@Transactional或者声明的方式配置的事务边界,那么Spring会在开始事务之前通过AOP的方式为当前线程创建Session,此时调用getCurrentSession()将得到正确结果。
产生以上异常的原因在于Spring提供了自己的CurrentSessionContext实现,如果我们不打算使用Spring,而是自己直接从hibernate.cfg.xml创建SessionFactory,并且为在hibernate.cfg.xml中设置current_session_context_class为thread,也即使用了ThreadLocalSessionContext,那么我们在调用getCurrentSession()时,如果当前线程没有Session存在,则会创建一个绑定到当前线程。
查了一下程序,service里果然忘了写@Transactional,添加之后程序正常执行了。
另外,有一个问题要注意,在刚开始添加@Transactional后仍然报同样的错误。后来我查了一下,原因是我在eclipse中配了javarebel,所以每次改代码都不重启,但这次不好使,我想可能是@Transactional应该属于配置信息,以前是通过xml文件配置的,可能javarebel处理不了,重启了一遍,ok了。
补充一点,采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession(),创建的session必须手动关闭 。
写下这次调试的经历,希望能帮助别人,同时记录自己的心路历程。
Hibernate中SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,是否自动创建新的取决于CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的currentSession()方法来获得Session。在Spring中,如果我们在没有配置TransactionManager并且没有事先调用SessionFactory.openSession()的情况直接调用getCurrentSession(),那么程序将抛出“No
Session found for current thread”异常。如果配置了TranactionManager并且通过@Transactional或者声明的方式配置的事务边界,那么Spring会在开始事务之前通过AOP的方式为当前线程创建Session,此时调用getCurrentSession()将得到正确结果。
产生以上异常的原因在于Spring提供了自己的CurrentSessionContext实现,如果我们不打算使用Spring,而是自己直接从hibernate.cfg.xml创建SessionFactory,并且为在hibernate.cfg.xml中设置current_session_context_class为thread,也即使用了ThreadLocalSessionContext,那么我们在调用getCurrentSession()时,如果当前线程没有Session存在,则会创建一个绑定到当前线程。
查了一下程序,service里果然忘了写@Transactional,添加之后程序正常执行了。
另外,有一个问题要注意,在刚开始添加@Transactional后仍然报同样的错误。后来我查了一下,原因是我在eclipse中配了javarebel,所以每次改代码都不重启,但这次不好使,我想可能是@Transactional应该属于配置信息,以前是通过xml文件配置的,可能javarebel处理不了,重启了一遍,ok了。
补充一点,采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession(),创建的session必须手动关闭 。
写下这次调试的经历,希望能帮助别人,同时记录自己的心路历程。
相关文章推荐
- ListView之BaseAdapter的用法简单案例(四)
- JAVA 获取进程PID
- CoAP Request and Response Rules
- 【步兵 c++】vector 的 去重
- [Unity游戏开发]向量在游戏开发中的应用(三)
- 80.GitHub前100第三方库及各大公司使用的第三方库
- Lua学习笔记-习题9.3
- MYSQL FABRIC 分片测试
- java 打开本地程序
- Could not find com.android.tools.build:gradle:1.3.0.
- RHDS或centos-ds或389目录服务安装总结 推荐
- 【codevs 2306】【bzoj 1877】[SDOI 2009]晨跑(费用流)
- spring+spring mvc +mybatis+druid 实现数据库主从分离
- iOS自定义键盘弹出view的位置移动(三种方法)
- C++设计模式<三>:模板方法(Template Method 模式)
- PopupWindow从底部划入划出
- Flex 布局教程:语法篇
- Java实现插入排序之希尔排序
- Ubuntu安装pycharm, No JDK found. Please validate either PYCHARM_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation
- iOS 获取当前时间 年、月、日、周几