当前位置: 首页 > 知识库问答 >
问题:

事务测试无法更新/删除

顾宣
2023-03-14

我有一个@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注释每个单独的测试,它仍然会失败。

共有1个答案

夹谷奇
2023-03-14

为什么要用@springbootplication注释测试类?不推荐!无论如何,这可能只是为了快速测试。我不知道你到底想测试什么方法,但举个例子,测试下面代码中的save方法是一个很好的方法,试试看它是否对你有用。

@SpringBootTest
@RunWith(SpringRunner.class)
public class RepoTest {

    @Autowired
    private ExampleRepo repository;

    @Test
    @Transactional
    public void save_() {
        Object savedObj = repository.save(entity);
        assertNotNull(savedObj.getId());
    }
}
 类似资料:
  • 问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对 持久性 实体所做的更改并相应地更新数据库。hibernate参考手册的

  • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?

  • 我有两个对象实体(用户和电话),它们应该有多对多关系。 使用者JAVA 电话JAVA 现在,我在用户表中添加了两个ID为1和2的用户。然后,我添加一个id为1的手机,并将它们映射到两个用户id(1) 我的用户电话表如下所示: 现在,我想删除一个ID为2的用户。当我尝试这样做时,我得到了一个错误 我的删除脚本: 知道我哪里出错了吗?非常感谢:)

  • 关于这个问题有好几篇帖子,但仍然没有找到答案。这是父类Userr。在@OneToMany关系中,我想删除一个特定的子帐户。 现在,当我通过“删除”查询执行此操作时,我得到以下异常。 组织。springframework。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredExceptio

  • 我有父实体和一个方向作为具有关系的子实体。我尝试使用Hibernate查询删除超过一周的广告,但得到的结果是: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(.,constraint外键()引用() 用户: 筛选器: 广告: DAO删除方法:

  • 我正在用Geb(0.12.2)和Spock定义一些规范来测试我的前端。我的应用程序的登录系统依赖于我们内部IDP的SSO。一旦我进入我的应用程序的私人部分,如果以前没有在我们的IDP中登录,它将重定向到IDP主页,然后登录并重定向到您最初询问的私人URL。 注销。 删除IDP设置的cookie。 我希望初始化每一个GebSpec类,而不需要任何以前的cookie或以前GebSpec执行中的状态,并