首页 > 解决方案 > 带有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

标签: spring-data-jpajunit4spring-transactions

解决方案


您的方法process()@Transactional. 这意味着它需要一个事务。

由于您似乎在 Spring 应用程序上下文中运行此注释,因此如果现在事务可用,则会评估注释并引发异常。

通过添加@Transactional到测试中,您可以使事务可用(将在测试结束时回滚)。


推荐阅读