2

JpaRepository を拡張する自動配線されたインターフェースがいくつかあります。それらのそれぞれには、異なるエンティティに対して「更新」hqlメソッドがあります。これらのメソッドをサービスのメソッドから呼び出しています。

それらのいずれかが失敗した場合、すべてのデータをロールバックするために 1 つのトランザクションでそれらすべてを実行するにはどうすればよいですか?

service には属性 @service と @transactional がありますが、役に立ちません。

- - - - - - - - - - - - アップデート

ここに例があります。repository1.updateMethod() および repository2.updateMethod() は正常に動作し、repository3.save は制約エラーのために例外をスローします。その結果、repository1 および repository2 メソッドの結果が保存されていることがわかります。ロールバックする必要があります。

@ Service
@ Transactional(rollbackFor = {RuntimeException.class})
public SomeService {
  @ Autowired SomeRepository repository1;
  @ Autowired AnotherRepository repository2;
  @ Autowired ThirdRepository repository3;
  ...
  @ Transactional(rollbackFor = {RuntimeException.class})
  public void SomeMethod(SomeEntity obj, String someNewValue) {
    try {
      repository1.updateMethod();
      repository2.updateMethod();
      obj.setValue(someNewValue);
      repository3.save(obj);
    } catch (Exception ex) {
      throw new RuntimeException();
    }   
  }
}
4

1 に答える 1