Spring测试Hibernate执行update方法之后数据库未更新的原因

Spring测试Hibernate执行update方法之后数据库未更新的原因昨天在写Dao层之后进行测试,用Junit执行session.save()方法的时候可以持久化到数据库,但是测试执行session.update()的时候却显示执行成功但是数据库却没有变化,网上的回答说是事务没有开启,但我的Hibernate事务都是交给Spring来管理的<!事务配置声明式事务> <beanid=”transactionManager” …

昨天在写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()的作用,感觉这篇博客写的很不错

https://blog.csdn.net/lssssss/article/details/6839633

然后我就想为什么spring不会提交事务,所以就找了资料说如果在集成的过程中,我们抛弃了hibernate.cfg.xml文件,直接在Spring的的配置文件中进 行配置数据源的话,那你直接用HibernateTemplate里面提供的方法是可以成功操作数据的,如果你还是用hibernate.cfg.xml 来配置数据源,在Spring的配置文件中引用hibernate.cfg.xml文件,那么你不能成功,这其中的原因就是因为如果你用 hibernate.cfg.xml文件配置数据源,Hibernate默认是手动提交事务,而HibernateTemplatel 提供的方法里面并没有提供事务提交,而如果你用Spring的配置文件来配置数据源,Sping默认是自动提交的,所以就会成功。
具体可以看这篇博客:

https://www.cnblogs.com/hoobey/p/6058463.html

但后来我发现不是这个原因,原因居然是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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注