SpringJPAを使用したときに問題が発生しました。次のように更新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の更新はうまく機能します。アカウントのステータスが変更されました。
テストは2つの方法で合格することができます。accountRepository.findOne()をデータベース内の既存のアカウントに呼び出すと(ここでは、テストコードで、すべてのアカウントレコードがテスト開始前に挿入されます。createAccountsメソッドを参照してください)
または、@ Modified(clearAutomatically = false)を追加すると、すべてが良好に見えます。
SpringのWebサイトにclearAutomaticallyに関するドキュメントを確認しました。しかし、私はまだ私のコードの振る舞いを理解することができません。
私のSpring-JPAバージョンは1.1.0で、clearAutomaticallyのデフォルト値がtrueに変更されています。
Spring JPAについてよく知っている人はいますか?
ありがとう