gpt4 book ai didi

hibernate - 事务未在 Spring Test 中回滚以进行删除操作

转载 作者:行者123 更新时间:2023-12-03 08:08:43 26 4
gpt4 key购买 nike

不知何故,我的测试在进行 Spring 测试时没有回滚删除事务。数据被永久删除。 我正在使用 Spring-Hibernate 组合。

这是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners( {TransactionalTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class
})
@ContextConfiguration(locations={"/testApplicationContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class TestDummy {

private ApplicationContext context;

@Transactional
private AccountManager getAccountManager() {
this.context = new ClassPathXmlApplicationContext("testApplicationContext.xml");
return (AccountManager) context.getBean("accountManager");
}



@Test
@Transactional
@Rollback(true)
public void testDeleteAccount(){

Account acc = getAccountManager().getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D");
System.out.println("Account name is "+acc.getAccountName());
getAccountManager().deleteAccountHard(acc);
Account acc1 = getAccountManager().getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D");
if(acc1 != null){
System.out.println("Now name is "+ acc1.getAccountName());
}else{
System.out.println("Account again is null");
}

}
}

我可以在控制台上看到消息“Account again is null”,这是应该的。就像在测试中一样。但是测试完成后。在数据库中,id 为“87EDA29EBB65371CE04500144F54AB6D”的记录被永久删除!。它应该在测试完成后回滚。我真的很困惑为什么事务没有回滚。

这是我的 testApplicationContext.xml 条目:

        <bean id="accountManager"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target"><ref local="accountManagerTarget"/></property>
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<!-- Avoid PROPAGATION_REQUIRED !! It could kill your performances by generating a new transaction on each request !! -->

<prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>

</props>
</property>
<property name="preInterceptors">
<list>
<ref bean="hibernateInterceptor"/>
</list>
</property>

</bean>


<bean id="accountManagerTarget"
class="com.db.spgit.abstrack.manager.AccountManager">
<property name="accountDaoHibernate" ref="accountDaoHibernate" />
</bean>


<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="configLocation">
<value>classpath:hibernate-test.cfg.xml</value>
</property>
</bean>

<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>


<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

最佳答案

你的测试看起来很奇怪。 @ContextConfiguration 已经加载应用程序上下文,您不需要手动执行。

以下代码应按预期工作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/testApplicationContext.xml"})
@TransactionConfiguration(defaultRollback=true)
public class TestDummy {
@Autowired
private AccountManager accountManager;

@Test
@Transactional
public void testDeleteAccount(){
Account acc = accountManager.getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D");
System.out.println("Account name is "+acc.getAccountName());
accountManager.deleteAccountHard(acc);
Account acc1 = accountManager.getAccountDaoHibernate().get("87EDA29EBB65371CE04500144F54AB6D");
if(acc1 != null){
System.out.println("Now name is "+ acc1.getAccountName());
}else{
System.out.println("Account again is null");
}
}
}

另请参阅:

关于hibernate - 事务未在 Spring Test 中回滚以进行删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5109478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com