【发布时间】:2021-12-28 12:52:57
【问题描述】:
我有一个@Repository,它有几个不同的查询来更新表。这些方法没有使用@Transactional 注释,因为事务处于服务级别。
我想测试这些存储库。我创建了一个带有 @Transactional 注释的测试类,但是当调用存储库方法时,它们会失败:
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
如果我用@Transactional 注释每个存储库方法,它会修复错误,但我不想更改主代码库。我应该能够在测试中创建事务。
我创建了一些示例代码来展示我的一般结构。
存储库
@Repository
public class ExampleRepo extends JPARepository<X, Y> {
// Adding @Transactional here fixes the test
@Modifying
@Query("update Example e set e.example=:example where e.id = :id")
int exampleQuery(@Param("example") String example, @Param("id") int id);
}
测试
@Transactional
@SpringBootApplication
@SpringBootTest
public class RepoTest {
private final ExampleRepo repository;
@Autowired
public RepoTest(final ExampleRepo repository){
this.repository = repository;
}
@Test
void testExample() {
// Fails
repository.exampleQuery("example", 1);
}
}
例外
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
不应该将测试注释为 `@Transactional' 来解决这个问题吗?
我能找到的所有示例都使用它。如果我用@Transactional 注释每个单独的测试,它仍然会失败。
【问题讨论】:
标签: java spring spring-boot spring-transactions