首页 文章

Spring JUnit JPA Transaction没有回滚

提问于
浏览
4

我正在尝试测试使用JPA EntityManager来获取和更新实体的DAO . 我已将单元测试标记为Transactional,并将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"/>

3 回答

  • 1

    你的配置似乎很好 . 意外提交可能有不同的原因,可能是具有自动提交模式的数据源或非事务兼容数据库(带有MyISAM的mysql?)

    你查了这个帖子Why are transactions not rolling back when using SpringJUnit4ClassRunner/MySQL/Spring/Hibernate吗?

  • 0

    @TransactionConfiguration(defaultRollback =假)

    可能是罪魁祸首 . 尝试使用defaultRollback = true,这应该回滚事务 .

  • 0

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

    @Transactional(rollbackFor=Exception.class)
    

相关问题