【问题标题】:Spring JUnit JPA Transaction not rolling backSpring JUnit JPA 事务不回滚
【发布时间】:2013-05-08 05:52:32
【问题描述】:

我正在尝试测试我的 DAO,它使用 JPA EntityManager 来获取和更新实体。我已将我的单元测试标记为事务性并将 defaultRollback 属性设置为 false。但是,在抛出 rune time 异常时,我看不到我的事务在测试结束时回滚。数据被保存在数据库中。这是我的单元测试代码以及​​弹簧配置。我显然错过了一些东西,但无法确定是什么。 顺便说一句,事务是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
    }
}

弹簧配置

<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什么存储引擎?
  • 是的,我使用的是 SQL Server 2008,并且数据库已经更新了值。顺便说一句,我的 JPA 提供者是 IBM Websphere Thin client
  • 我遇到了事务没有回滚的问题,由 TransactionalTestExecutionListener.class 修复了谢谢!!!

标签: spring jpa


【解决方案1】:

您的配置看起来不错。 意外提交可能有不同的原因,可能是具有自动提交模式的数据源或不符合事务的数据库(带有 MyISAM 的 mysql ?)

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

【讨论】:

【解决方案2】:

@TransactionConfiguration(defaultRollback=false)

可能是罪魁祸首。试试 defaultRollback=true,应该回滚事务。

【讨论】:

    【解决方案3】:

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

    @Transactional(rollbackFor=Exception.class)
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 2018-12-30
      • 2015-10-25
      • 2012-02-04
      • 2017-03-03
      • 2012-03-10
      • 2018-07-15
      相关资源
      最近更新 更多