gpt4 book ai didi

java - 将 @Transactional 添加到 Testcase 会导致数据库中的实体不持久

转载 作者:行者123 更新时间:2023-12-01 11:41:35 24 4
gpt4 key购买 nike

我有一些测试类,通常如下所示

@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
}
}

但是,足够有趣的是,将注释添加到一些虚拟方法中,最终条目被保存在数据库中。 IE。以下“作品”:

    @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 堆栈。

谢谢

最佳答案

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

参见http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#integration-testing-annotations了解更多信息。

关于java - 将 @Transactional 添加到 Testcase 会导致数据库中的实体不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29480047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com