Spring Hibernate 事务管理配置问题

练习个项目,发现执行到dao层里的方法时总是抛org.hibernate.HibernateException:xxxxx is not vaild without active transaction. 例如执行session.save(xxxEntity) 就抛出 save is not vaild without active transaction.

找到好多的教程都说是要在配置hibernateProperties时加一条:

如果采用jdbc独立引用程序配置如下:
<property name="hibernate.current_session_context_class">thread</property>
如果采用了JTA事务配置如下
<property name="hibernate.current_session_context_class">jta</property>
注:真实情况是加了不一定好用,需要理解正确才能判断出到底加还是不加。

理解为在事务管理时,session所处容器(环境)。

就是说用sessionFactory的getCurrentSession()得到的那个session总是位于容器里的同一个实例。这样,在业务层管理的一个方法(对应一个事务)中执行的多条dao层方法(每个方法都会去打开currentSession) 中用的是一个session。 容器会管理它的生命周期,我们就不用手动的去close 掉session. 这也是通常用getCurrentSession. 不用openSession方法打开一个新session的原因。

请理解上面这段话。当你用spring为业务层管理事务时,无论你用@Transactional注解,还是配置在spring的xml文件中,你都会发现加了上面的那句配置会导致抛出org.hibernate.HibernateException:xxxxx is not vaild without active transaction。

你会纳闷:明明设置了事务管理啊~!还是spring的事务管理,名角儿,怎么能说没有活动的事务设置呢? 这是因为session 和transaction不在同一个容器(环境)里造成的。session是在普通的thread里,而transaction是spring的context里。 我感觉,后者范围小一些,到不了thread里去为其session进行事务管理,所以session找不到事务。怎么办?

很简单,去掉那行hibernate.current_session_context_class的配置。这样session就交给spring的context了。

PS:找了半天的相关文章找不到一个解决方法,终于发现http://blog.csdn.net/javavenus/archive/2010/08/12/5806164.aspx里有,看过后才大彻大悟,遂改了程序,运行成功后,总结于此
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值