spring-data-jpa - 带有Spring jpa的junit上的Spring Transaction注释
问题描述
为什么一个测试用例需要@Transactional,其功能将在dao层进行更新(JPA存储库),例如
@Test
@Transactional
public void processTestSuccess() throws Exception{
abc.process();//abc instance of Abc class
}
public class Abc{
@Transactional
public void process(){
.....
jpaRepository.update(10); // spring jpa repo updating something
}
}
当测试在没有@Transaction 注释的情况下运行时,它会在行给出以下异常
jpa.update(10);
org.springframework.dao.InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套异常是 javax.persistence.TransactionRequiredException: Executing an update/delete query
解决方案
您的方法process()
用@Transactional
. 这意味着它需要一个事务。
由于您似乎在 Spring 应用程序上下文中运行此注释,因此如果现在事务可用,则会评估注释并引发异常。
通过添加@Transactional
到测试中,您可以使事务可用(将在测试结束时回滚)。