ここでの短い答えはありません。
利用可能な唯一のトグルオプションは、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の側面を無効にしようとすると、監査の観点から悪影響が及ぶ可能性があります。
私はあなたのパフォーマンスに関する懸念を理解していますが、あなたの実装を考えればわかります。あなたの懸念事項にメリットがあるかどうかをプロファイリングして決定しましたか? Enversは、ほとんどまたはまったくオーバーヘッドがなく、何百万行も管理する多数の大規模な民間組織によって使用されています。おそらく、あなたはあなたのユースケースについてより詳しく説明することができ、私は答えを提供してくれるでしょう。 – Naros