我在使用 Spring JPA 时遇到了一个问题。我想编写如下更新 SQL:
@Modifying
@Query("update Account as a set a.status = ?1 where a.id in (?2)")
public int updateStatus(ACCOUNT_STATUS status, List<Long> id);
然后我写了一些测试来测试它。
private List<Account> createAccounts() {
List<Account> accounts = new ArrayList<>();
Account account1 = new Account();
account1.setCaseNumber("999123");
account1.setAccountNbr("888123");
account1.setCaseType(CASE_TYPE.REGULAR);
account1.setStatus(ACCOUNT_STATUS.NOT_USED);
accountRepository.save(account1);
Account account2 = new Account();
account2.setCaseNumber("999456");
account2.setAccountNbr("888456");
account2.setCaseType(CASE_TYPE.REGULAR);
account2.setStatus(ACCOUNT_STATUS.NOT_USED);
accountRepository.save(account2);
Account account3 = new Account();
account3.setCaseNumber("999789");
account3.setAccountNbr("888789");
account3.setCaseType(CASE_TYPE.DISASTER);
account3.setStatus(ACCOUNT_STATUS.NOT_USED);
accountRepository.save(account3);
accounts.add(account1);
accounts.add(account2);
accounts.add(account3);
return accounts;
}
@Test
public void testUpdateAccountStatus() {
List<Long> ids = new ArrayList<>();
List<Account> accounts = createAccounts();
for (Account account : accounts) {
ids.add(account.getId());
}
int count = accountRepository.updateStatus(ACCOUNT_STATUS.USED, ids);
Assert.assertEquals(ids.size(), count);
for (Long id : ids) {
Account account = accountRepository.findOne(id);
Assert.assertEquals(ACCOUNT_STATUS.USED, account.getStatus());
}
}
测试失败,因为状态没有改变。但实际上更新 SQL 效果很好。帐户状态已更改。
可以通过两种方式通过测试。如果我将 accountRepository.findOne() 调用到数据库中的现有 Account (这里,在测试代码中,所有 Account 记录都在测试开始之前插入,请参见 createAccounts 方法)
或者,如果我添加@Modifying(clearAutomatically=false),一切看起来都不错。
我在 Spring 网站上检查了有关 clearAutomatically 的文档。但我仍然无法理解我的代码行为。
我的 Spring-JPA 版本是 1.1.0,它已将 clearAutomatically 默认值更改为 true。
有没有人对 Spring JPA 了解太多?
谢谢