我有一个@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
注释每个单独的测试,它仍然会失败。
为什么要用@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执行中的状态,并