将@Transactional添加到Testcase会导致数据库中没有持久化的实体

时间:2015-04-06 21:32:30

标签: java spring transactions junit4 spring-data-jpa

我有一些通常看起来如下的测试类

@RunWith(SpringJUnit4ClassRunner.class)
@org.springframework.transaction.annotation.Transactional
public class SpringTestRunnerTransactionTest {
 // Some tests which involve inserting data in the db here --> No persisted entries but 
 // entries can be fetched in same transaction
}

传递我所有当前的测试(还包括查询已插入同一测试用例中的插入数据)。但是,当我之后检查数据库时,没有持久的条目。 在测试方法之上添加@org.springframework.transaction.annotation.Transactional注释时也是如此,即

@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTestRunnerTransactionTest {
   @org.springframework.transaction.annotation.Transactional
   @Test
   public void test() {
     // Some tests which involve inserting data in the db here --> No persisted entries but 
     // entries can be fetched in same transaction
    }
}

然而,有趣的是,将注释添加到某个虚拟方法中,最后条目将保留在db中。即以下“作品”:

    @RunWith(SpringJUnit4ClassRunner.class)
    public class SpringTestRunnerTransactionTest {

        @Test
        public void test() {
            abstraction();
        }

        @org.springframework.transaction.annotation.Transactional
        public void abstraction(){
            // Doing all the tests here works fine and the entities 
            // are persisted in the database!!!!!
        }
   }

现在我想知道为什么会这样。我假设在第一种情况下,事务未提交或回滚,但我不明白为什么。或者是否存在直接注释测试类和方法的一般问题?

更多信息:我正在使用SpringData JPA / Hibernate / H2堆栈。

谢谢

1 个答案:

答案 0 :(得分:1)

默认情况下,事务在spring测试中回滚。如果你想提交使用 在课程级别@TransactionConfiguration(defaultRollback = false)或在方法级别@Rollback(false)

请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#integration-testing-annotations了解详情。