2017-05-14 9 views
0

を削除休止状態Enversは、私が休止状態-envers 4.1.8.Finalを使用するモード

私enversの設定: org.hibernate.envers.store_data_at_delete =真

私は期待している私は、ベーステーブル内のレコードを削除する場合、 新しいレコードは同じ列と同じデータを持つtable_audに挿入されます。 があります。データはrevtype以外table_audのoffcourceに挿入し、上記の設定が正しく動作しません。他の言葉で

を吹けません! 誰でも助けてくれますか?

+0

あなたは休止状態に、このプロパティを渡しているかなどがもらえますか?それはhibernate.propertiesファイルか、またはある種のスプリング構成ですか? appContext-hibernateの – Naros

+0

。XML: 、プロパティの設定を使用して、クラスパスのルートにhibernate.propertiesファイルを作成する場合

+0

真<キー= "org.hibernate.envers.store_data_at_delete" を支える>とあなたのシナリオを再試行しますか? – Naros

答えて

0

ご意見に基づき、問題はあなたがかなりのEntityManager /セッションに指定された2つの除去方法を使用するよりも、実体参照を削除するためにHQLを使用している事実である:

  • session.delete(Object)
  • entityManager.remove(Object)

JPQLまたはHQLステートメントを使用する場合、Hibernateは特定のイベントを発生させないため、これらのイベントをリスンする統合は通知されません。この場合、post-deleteイベントが発生しません、あなたはREVTYPE行がRevisionType.DELエントリに追加されて見ることはありませんなぜそれがです。上記2つのに述べた方法のいずれかを使用して

はあなたの問題を解決します。

ここで重要な点は、HQL/JPQL文が、CriteriaDeleteCriteriaUpdateというJPAの意図と同じように、一括操作として機能できることです。これらは、永続性プロバイダは、必ずしも永続コンテキストに負荷エンティティ状態にせずに、データベース・オブジェクトにバルクで、潜在的にDML操作を適用することを意味します。

は、あなたがしようとしているユースケースを考えてみて。エンティティがデータベースからロードされておらず、単にDELETE FROM YourEntity WHERE id = :idと呼んでいるとします。いいえエンティティの状態は、この場合にはロードされていないので、イベントが発生するようにしている場合、知られている唯一の関連情報は、次のとおりです。

  • エンティティタイプ
  • :idで指定された指定された値でidという名前のいくつかの属性。

この場合、属性は、おそらく主キーですが、それは簡単にそのエンティティクラス上の任意のランダムな属性だったかもしれないので、実際にして永続コンテキストを初期化せずに、このようなユースケースを監査する有効な方法はありませんエンティティの状態が最初になります。これは、操作が大量の行に対して行われた場合は、特にDELETE操作では無駄な操作になります。

についてのいくつかの洞察を提供したいと思っています。なぜあなたはあなたが何をするかを見ます。