1

Hibernate、Hibernate EnversおよびQueryDSLは、Springブート1.4.1.RELEASEで正しく構成され、正しく動作します。QueryDSLアップデートによるHibernate Envers

UpdateClause<JPAUpdateClause> updateQueryBuilder = queryFactory.update(collectionTransaction);を使用して更新クエリを作成し、その更新クエリを実行すると、Hibernate Enversがその変更を取得して監査しないという問題があります。 HibernateはEnversは、このような状況の変化をピックアップするため

後QueryDSL

public class CollectionTransactionRepositoryImpl extends QueryDslRepositorySupport implements CollectionTransactionRepositoryCustom { 
    @Autowired 
    private JPAQueryFactory queryFactory; 

    public CollectionTransactionRepositoryImpl() { 
     super(CollectionTransaction.class); 
    } 

    @Override 
    public Collection<CollectionTransaction> updateCollectionTransaction(UpdateCollectionTransaction updateCollectionTransaction) { 
     QCollectionTransaction collectionTransaction = QCollectionTransaction.collectionTransaction; 
     UpdateClause<JPAUpdateClause> updateQueryBuilder = queryFactory.update(collectionTransaction); 
     .....//Code omitted for brevity 
     long updated = updateQueryBuilder.execute(); 
     //..... 
     return ... 
    } 
} 

を実装春データJPAリポジトリは、それは可能ですか?

答えて

2

これは、JIRA HHH-10318で概説されている既知の問題です。

Enversは、Hibernateのイベントサブシステムに基づいて動作し、Hibernateはエンティティが何らかの方法で変更された様々なコールバックを効果的に通知し、以前のエンティティ状態と新しいエンティティ状態の両方を提供します。この状態は、Enversが何が変更されたかを判断し、監査変更行を挿入するために使用されるものです。

UPDATE MyEntity e SET e.status = :status 

Hibernateは次のタスクを実行します:

  1. が永続コンテキストに任意の変更をフラッシュ

    は、簡単な例をとることができます。

  2. MyEntityのキャッシュされたインスタンスを無効にします。
  3. 一括更新操作を実行します。

いいえこれらの手順のいずれにおいても、Hibernateは既存の状態をロードしません。現在の変更が一括更新前にフラッシュされ、後続の操作が一括更新のためにキャッシュではなくデータストアからフェッチされることを保証するだけです。

したがって、Enversパースペクティブからは、コールバックを取得しないため、Hibernate ORMはそのような操作のエンティティ状態を提供できないため、操作が行われたことに気付かず、単に存在しません。

ここで大きな問題は、可能であれば、そのような操作の変更単位をモデル化して処理する方法です。

Enversは、PreBulkOpEventのタイプを効果的に必要とし、変更しようとしているものをキャッシュできるようにし、PostBulkOpEventが2つの結果を必要とし、変更ログエントリを生成するためにマージすることは困難です。このようなコンセプトに対する懸念は、実際に回避するためにこれを効果的に行う方法を中心にしています。

  1. 大きな結果セット操作のためにメモリが不足しています。
  2. 大きな結果セット操作のためにデータストアから状態をロードするための実行時間が長い。

とにかく、JIRAを読んで、フィードバックやアイデアをお寄せください。しかし、現在のところ、現時点で捕らえることのできる範囲外のものです。

関連する問題