昨天在写Dao层之后进行测试,用Junit执行session.save()方法的时候可以持久化到数据库,但是测试执行session.update()的时候却显示执行成功但是数据库却没有变化,网上的回答说是事务没有开启,但我的Hibernate事务都是交给Spring来管理的
<!-- 事务配置 声明式事务 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 使用annotation定义事务 -->
<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事务传播属性 -->
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="edit*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="new*" propagation="REQUIRED" />
<tx:method name="set*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="change*" propagation="REQUIRED" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" />
<tx:method name="load*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
所以就有点不解,但还是照着网上说的试了一下在执行完update的后面执行flush()和clear();
sessionFactory.getCurrentSession().update(user);
sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().clear();
然后真的就成功了,上网找了一下flush()和clear()的作用,感觉这篇博客写的很不错
然后我就想为什么spring不会提交事务,所以就找了资料说如果在集成的过程中,我们抛弃了hibernate.cfg.xml文件,直接在Spring的的配置文件中进 行配置数据源的话,那你直接用HibernateTemplate里面提供的方法是可以成功操作数据的,如果你还是用hibernate.cfg.xml 来配置数据源,在Spring的配置文件中引用hibernate.cfg.xml文件,那么你不能成功,这其中的原因就是因为如果你用 hibernate.cfg.xml文件配置数据源,Hibernate默认是手动提交事务,而HibernateTemplatel 提供的方法里面并没有提供事务提交,而如果你用Spring的配置文件来配置数据源,Sping默认是自动提交的,所以就会成功。
具体可以看这篇博客:
但后来我发现不是这个原因,原因居然是spring test测试默认会将事务回滚,如果想阻止spring transactional回滚,在test方法上加注解@Rollback(false)即可
@Test
@Rollback(false)
public void testUpdate() {
User u=new User();
u.setUserId(1);
u.setUserName("Ring");
userDao.update(u);
}
这样就成功了,但我还是没搞懂为什么我测试save方法的时候却不会自动回滚,而是直接持久化到数据库。。。。。。。。希望有大佬可以解答一下
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36046.html