练习个项目,发现执行到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里有,看过后才大彻大悟,遂改了程序,运行成功后,总结于此
分享到:
相关推荐
Spring+Hibernate 使用TransactionInterceptor声明式事务配置
spring3,hibernate4 配置声明式事务管理(annotation方式)
在Spring中配置Hibernate事务
Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...
spring mvc hibernate整合,采用MyEclipse自动生成包和配置文件,jar包可能有多余,但是不影响整体效果。服务器tomcat。数据库mysql。
在spring中配置hibernate事务
前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...
一个小实例工程,说的是spring3+hibernate4配置声明式事务管理(annotation方式)
spring与hibernate的整合 spring事务的配置
spring3、 hibernate4 配置声明式事务管理(annotation方式)
spring+hibernate spring配置事务
一个实例小工程,说的是spring3+hibernate4怎么配置声明式事务管理(xml方式)
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA) 结合spring 和durid进行配置,
本程序是struts spring hibernate的完整环境配置, 包括: struts1.3 spring 2.0 hibernate 3.1 的所有完整的包。 BeanNameAutoProxyCreator事务处理 中文乱码解决 MD5程序加密 AJAX验证码等 ...
struts+hibernate+spring事务配置
本程序是struts spring hibernate的完整环境配置, 包括: struts1.3 spring 2.0 hibernate 3.1 的所有完整的包。 BeanNameAutoProxyCreator事务处理 中文乱码解决 MD5程序加密 AJAX验证码等 ...
本程序是struts spring hibernate的完整环境配置, 包括: struts1.3 spring 2.0 hibernate 3.1 的所有完整的包。 BeanNameAutoProxyCreator事务处理 中文乱码解决 MD5程序加密 AJAX验证码等 ...
问题提出:Spring对Hibernate有自动管理事务功能,业务类的方法调用DAO类(例如:MeddicService业务类调用MeddicDAO类的save保存方法)是可以进行事务管理的,即“事务传播行为”,疑问来了,如果DAO的save方法有2个...
spring+hibernate+atomikos实现多数据源分布式事务管理