事务不在Spring Test中回滚以进行删除操作

时间:2011-02-24 19:31:34

标签: hibernate spring junit4 spring-test

不知何故,我的测试在执行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");
        }

    }
}

我可以看到控制台上的消息“帐户再次为空”应该是。正如它在测试中一样。但测试结束后。在数据库中,永久删除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>

1 个答案:

答案 0 :(得分:4)

你的测试看起来很奇怪。 @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");
        }           
    }
}

另见:

相关问题