私はエンティティが更新されるたびにイベントを聴くためにjpa EntityListners
注釈を使用しています。問題は@PostPersist
で、@PostUpdate
はcommit
とflush
の両方でこのイベントをトリガーします。私のコードでは、私はコミットする前にフラッシュを使用しています(このロジックを変更することはできません/フラッシュ呼び出しを削除することはできません)。私のコード例:エンティティからのonCommitイベントのみを公開するにはどうすればよいですか?
@Transactional
public void updateValue(int id, String value) throws ServiceException {
try {
BusinessEntity bEntity = businessRepository.findById(id);
bEntity.setValue(value);
businessRepository.merge(trip);
//First event is fired
businessRepository.flush();
someService.performLogicThatUpdatesBusinessEntityAgain();
} catch (DatabaseException e) {
throw new ServiceException(e);
}
//transaction is committed and hence Second event is fired
}
これにより、2つのイベントが互いに近づきすぎる原因となります。どちらもエンティティの値が異なります。大音量で起こることは、一連の出来事を混乱させる。エンティティリスナーは、イベントをキューにもパブリッシュします。消費者はエンティティのdtoを読み取り、no-sqlでセーブ/更新を行います。フラッシュイベントを避けることはできますか? トランザクションごとにエンティティを更新するだけですので?