遇到当前线程无session的问题No Session found for current thread

     今天在开发程序时,发生了一个错误,系统报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必须手动关闭 。


       写下这次调试的经历,希望能帮助别人,同时记录自己的心路历程。
————————————————
版权声明:本文为CSDN博主「智由静生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zsh2050/article/details/51088229

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值