Spring JUnit JPA 事务未回滚

4

我正在尝试测试使用JPA EntityManager获取和更新实体的DAO。我将我的单元测试标记为事务性,并将defaultRollback属性设置为false。然而,当抛出运行时异常时,我没有看到我的事务回滚。数据被持久化在数据库中。以下是我的单元测试代码以及Spring配置。显然我遗漏了一些东西,但还没有能够确定是什么。 顺便说一下,persistence.xml中的事务是RESOURCE_LOCAL。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/test-jpa.xml"})
@TestExecutionListeners(
{   DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
@TransactionConfiguration(defaultRollback=false)
@Transactional
public class JpaTests {
    @PersistenceContext
    EntityManage em;

    @Test
    public void testTransactionQueueManager() {
        Object entity = em.find(1);
        //code to update entity omitted.
    entity = em.merge(entity);
    em.flush();
        throw new RuntimeException
    }
}

Spring配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jpa.driverclassname}" />
    <property name="url" value="${jpa.url}" />
    <property name="username" value="${jpa.username}" />
    <property name="password" value="${jpa.password}" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="${jpa.persistenceunitname}"/>
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DBDictionary"/>
        </bean>
    </property>
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

你是如何验证事务没有回滚的?数据库是否有更新的值?如果使用的是MySQL,使用了哪种存储引擎? - gkamal
是的,我正在使用SQL Server 2008,数据库已经更新了数值。顺便说一下,我的JPA提供者是IBM Websphere Thin客户端。 - user320587
我曾经遇到过事务未回滚的问题,通过使用TransactionalTestExecutionListener.class解决了这个问题。谢谢!!! - avalon
3个回答

1

这是一个关于Spring JTA JPA DAO集成测试不回滚的问题的Stack Overflow链接。 - Gab

0

添加rollbackFor可能会有所帮助,这是一个常见的陷阱。

@Transactional(rollbackFor=Exception.class)

0

@TransactionConfiguration(defaultRollback=false)

可能是罪魁祸首。尝试将defaultRollback设置为true,这样就可以回滚事务了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接