2016-10-21 6 views
0

私は最初のHibernate Enversの実装を試みています。私は@Auditedタグをすべて取得しており、DDLを生成して監査テーブルを作成しています。Hibernate Enversでの監査の種類を制限する方法

私が読んだところでは、監査されたテーブルが新しいレコードを取得したり、レコードが変更されたり、レコードが削除されるたびに、監査テーブルがレコードを取得します。

私の実装では、変更には本当に気をつけましたが、監査にはパフォーマンスのヒットがあることを読んだので、私は必要のないものをオフにしたいと思います。

私はこれに関する情報を見つけるのに苦労しました。近くに来た唯一のことは、私がすべてのEnversリスナーをオフにして、自分で再実装する必要があると言いました。

これは多くの作業のようですが、私はすでに未知の領域です。誰もがこれを行う簡単な方法を知っていますか?それに失敗した人は、共有することができるコードを誰かが持っているのですか?

ありがとう、

+0

私はあなたのパフォーマンスに関する懸念を理解していますが、あなたの実装を考えればわかります。あなたの懸念事項にメリットがあるかどうかをプロファイリングして決定しましたか? Enversは、ほとんどまたはまったくオーバーヘッドがなく、何百万行も管理する多数の大規模な民間組織によって使用されています。おそらく、あなたはあなたのユースケースについてより詳しく説明することができ、私は答えを提供してくれるでしょう。 – Naros

答えて

1

ここでの短い答えはありません。

利用可能な唯一のトグルオプションは、DELリビジョンタイプの行のすべての列データを監査する必要があるかどうかをEnversに伝えることです。エンティティが削除されたときのデフォルトの動作は、すべてのカラム値を含めることではありません。この情報を保存することは非常に有用な場合があります。

さらに、特定のEnversリスナーの登録を防止する単純なケースではなく、特定のリスナーを記録するのと同じくらい簡単です。

は、上記のすべての3例で

// Fetch the parent 
Parent parent = entityManager.find(Parent.class, parentId); 

// Add a new child entity to parent 
entityManager.getTransaction().begin(); 
Child child = new Child("Naros"); 
child.setParent(parent); 
parent.getChildren().add(child); 
entityManager.persist(child); 
entityManager.merge(parent);  
entityManager.getTransaction().commit(); 

// Update a child entity 
entityManager.getTransaction().begin(); 
child.setName("Naros2"); 
entityManager.merge(child); 
entityManager.getTransaction().commit(); 

// Remove child entities from parent 
entityManager.getTransaction().begin(); 
parent.getChildren().forEach(c -> c.setParent(null)); 
parent.getChildren().clear(); 
entityManager.merge(parent); 
entityManager.getTransaction().commit(); 

いくつかの使用例を見てみましょう、Parentエンティティは、それが与えられたリビジョン番号で特定の時刻に変更されたことを説明しMOD改訂エントリで監査されます。

同様に、が親のコレクションに追加されたときにChildの修正されたエントリが含まれます。これには、Parentの最初の改訂版と同じリビジョン番号が含まれます。

Childが変更された場合、2番目のシナリオにはMOD改訂版のエントリが含まれます。親のコレクションのタイプに応じて、変更がコレクションの順序に影響を与えるかどうかは、Parentエンティティの場合でもMODがトリガーされる可能性があります。

最後のシナリオにはがコレクションから削除されたときにDELの改訂されたエントリが含まれ、親の状態が変更されたためMODが含まれます。

このタイプの動作を無効にすることはできますか?はい。しかし、これを行う際の問題は、貴重な機能を失うということです。

たとえば、Parentには、実際にプロパティーがParentに変更されたときの監査行のみが含まれ、関連付けられているコレクション・プロパティーを変更するときには監査行は含まれません。つまり、簡単な例では、Parentは1行の監査行しか持たず、挿入されたときはADDとなります。

しかし、子供コレクションの変更後の各改訂ステップで実際の状態がParentであることを知る必要がある場合はどうなりますか?まあ、できません。

ここでパフォーマンスが本当に問題になる理由については詳しくは触れていないので、具体的には必ずしもそのことに触れることができません。

しかし、Enversの側面を無効にしようとすると、監査の観点から悪影響が及ぶ可能性があります。

+0

情報ありがとうございます。アプリケーションがクラスを複製して永続化している場合、私には意味をなさないパフォーマンスの問題について読んでいました。しかし、それほどヒットしないと言うなら、私はそれでOKです。 –

+0

私は監査をしていたが、変更を加えた別のシステムから移行しています。変更を手動で監査テーブルに移行する予定でした。これはお勧めですか?変更レコードのみを作成するか、追加レコードとして最も古いリビジョンを作成する必要がありますか? –

+0

監査テーブルのスキーマとリビジョン番号の仕組みなどを明確に理解していれば、古い監査履歴を確実にEnversスキーマに移行できます。レガシーシステムから最初の変更エントリを 'ADD'と他の' MOD'として作成するだけです。もちろん、すべての遺産情報が重要でない場合は、最後のエントリだけを「追加」として移行することもできます(最後の遺跡変更=現在の記録スナップショットと仮定します)。 – Naros

関連する問題