2017-02-20 8 views
0

私はエンティティが更新されるたびにイベントを聴くためにjpa EntityListners注釈を使用しています。問題は@PostPersistで、@PostUpdatecommitflushの両方でこのイベントをトリガーします。私のコードでは、私はコミットする前にフラッシュを使用しています(このロジックを変更することはできません/フラッシュ呼び出しを削除することはできません)。私のコード例:エンティティからの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でセーブ/更新を行います。フラッシュイベントを避けることはできますか? トランザクションごとにエンティティを更新するだけですので

答えて

0

JPA仕様によると、@PostPersist@PostUpdateのコールバックは、データベースの挿入/更新操作後に発生します。これは、それぞれの関連するフラッシュ(あなたの場合は、merge呼び出し後に明示的にフラッシュされ、トランザクションがコミットするとき暗黙的にフラッシュされた後)に実行されることを意味します。

明示的なフラッシュを避けるためにロジックを変更することはできませんか?あなたが示したコードでは、マージされたエンティティはすでにIDを持っていますが、他の副作用が必要ですか?

実際には回避策がないようですが、明示的にフラッシュした後に変更されるエンティティの状態に基づいて、イベントハンドラで条件付きロジックを使用できますか?

関連する問題