我的环境是 spring-security3+springMVC+spring3.0.1+hibernate3.3
一下applicationContext-resource.xml中关于事务的配置,使用的注释
[code="java"]
<!-- 事务配置 -->
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.mxdba"/>
[/code]
我在做单元测试时没有问题,update的确是在事务下的
[code="java"]
@Test
@Rollback(false)
public void updateTest() {
CompanyArticle companyArticle = companyArticleServ.load(1L);
companyArticle.setContent("ddddd");
companyArticleServ.updateArticle(companyArticle, null);
}
[/code]
但是在正常情况下,update时没有任何反应,但是在update后添加getSession().flush()[color=red]就提交了[/color]
也就是说 事务并没有提交,因为如果事务正常执行的话,会flush的。
所以我在想是不是 事务没有运行,于是我尝试把 整个事务去掉,这时在
[code="java"]
public Session getSession() {
return sessionFactory.getCurrentSession();
}
[/code]
报了 没有绑定sessin,也就是说 事务实在工作的
我也想过是不是 spring-security的问题,因为他是一个filter,而在spring会用到opensessinfilter,不过我尝试过去掉spirng-security 发现问题照旧
我现在实在是没有思路了
你说起框架的bug我想起来了,记得以前看见一个地方讲过,我自己也的确碰到过,spring在同时使用 通过@Service@Resource等这几个注解注入的时候,里的package如果把你添加了@transactional的方法或者类也扫描到的话,@transactional就不会起到作用,具体解决办法见http://www.iteye.com/problems/2646
既然是Hibernate,那么数据的持久化就由Hibernate控制,只有在session的flush(),close()方法调用时,数据才会持久化到数据库中。
当然,这要看你的测试工具junit是否是一个完整周期,,spring在测试完成后,有没有关闭,不然Hibernate之类的,都不会自动close掉的
[quote]然而由于我使用了hibernate的事务(当然在这里是有spring托管的),在事务执行完后,自然应该commit,同时会出发flush。 [/quote]
如果配置了二级缓存,有可能导致事务commit,但是不会flush缓存
不知道你配置了没有,如果没有,就加上试试,或者把这句换成试试
spring管理hibernate事务应该是不需要手动flush,我觉得还是你的事务配置和使用的问题,我觉得你可以注意一下事务是配在什么地方(类上、接口上、方法上……),以及你的业务是怎么处于事务下的。推荐用proxy-target-class="true"这个配置,然后把事务注解放在具体的业务类的方法上,不要放在接口或者接口的方法上!用这种sessionFactory.getCurrentSession()方式得到session是必须置于事务之下的!
我在使用spring托管事务的时候碰见了和你一样的问题, 同问
jefyjiang 兄, 你真是救星阿, 我还以为是我的问题呢!!!!!
害我郁闷, 我碰见的问题和你是一模一样的!