這裏的簡短答案是沒有沒有。
可用的唯一可用的切換選項是告訴Envers它是否應審覈DEL
修訂版本行中的所有列數據。默認行爲是不包括刪除實體時的所有列值;但是,有些情況下,存儲此信息可能非常有用。
此外,這不僅僅是阻止特定Envers偵聽器註冊的簡單情況,也不像重新編碼特定偵聽器那麼簡單。
讓我們看看一些使用情況
// 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();
在所有3
箱子以上時,Parent
實體將與描述,它是在一個特定的時間,特定版本號修改了MOD
修改的條目進行審覈。
類似地,第一種情況將包含ADD
修訂後的Child
條目,該條目已添加到父級集合中。這將包含與Parent
的第一個修訂相同的修訂版本號。
第二種情況在修改時將包含MOD
修訂條目Child
。根據父級收集的類型,您所做的更改是否會影響收集的順序,也可能會爲Parent
實體觸發MOD
。
最後一種情況將包含DEL
當從集合中刪除Child
和MOD
的修訂條目,因爲父級的狀態已被修改。
可以禁用這種類型的行爲,是的。但是這樣做的問題是你失去了一些非常有價值的功能。
例如,Parent
將只包含審計行,用於實際修改Parent
的屬性,而不修改與其關聯的任何集合屬性。這意味着在一個簡單的例子中,Parent
只有一個審計行,ADD
被插入。
但是,如果您需要知道Parent
在兒童收藏變更後每個修訂步驟的實際狀態?那麼,你不能。
你還沒有給出任何細節,爲什麼性能真的會成爲一個問題,所以我不能一概而論。
但是試圖關閉Envers的各個方面可能並且如果您這樣做,可能會從審計角度產生負面影響。
我理解你的表現顧慮,但考慮到你的實施;你有沒有分析並確定你的擔憂是否有任何價值? Envers被許多大型私人組織所使用,它們管理着數百萬行,而且幾乎沒有開銷。也許你可以更詳細地闡述你關心的用例,我很樂意提供一個答案。 – Naros