2016-10-21 63 views
0

我正在嘗試我的第一個Hibernate Envers實現。我已經獲得了所有的@Audited標籤,並且生成了DDL以創建審計表。如何限制休眠Envers中的審計類型

從我讀到的內容來看,審計表將在每次審計表獲得新記錄,記錄更改或記錄被刪除時獲得記錄。

對於我的實現,我只關心更改,因爲我已經讀過審覈中有性能點擊,我想關閉我不需要的東西。

我已經很難找到這方面的信息。唯一接近的說,我需要關閉所有恩弗斯的聽衆,並自己重新實施,讓我不想做任何事情。

這似乎很多工作,我已經在未知領域。有誰知道一個簡單的方法來做到這一點?如果沒有,有沒有人有一些他們可以分享的代碼顯示如何做到這一點?

謝謝,

+0

我理解你的表現顧慮,但考慮到你的實施;你有沒有分析並確定你的擔憂是否有任何價值? Envers被許多大型私人組織所使用,它們管理着數百萬行,而且幾乎沒有開銷。也許你可以更詳細地闡述你關心的用例,我很樂意提供一個答案。 – Naros

回答

1

這裏的簡短答案是沒有沒有。

可用的唯一可用的切換選項是告訴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當從集合中刪除ChildMOD的修訂條目,因爲父級的狀態已被修改。

可以禁用這種類型的行爲,是的。但是這樣做的問題是你失去了一些非常有價值的功能。

例如,Parent將只包含審計行,用於實際修改Parent的屬性,而不修改與其關聯的任何集合屬性。這意味着在一個簡單的例子中,Parent只有一個審計行,ADD被插入。

但是,如果您需要知道Parent在兒童收藏變更後每個修訂步驟的實際狀態?那麼,你不能。

你還沒有給出任何細節,爲什麼性能真的會成爲一個問題,所以我不能一概而論。

但是試圖關閉Envers的各個方面可能並且如果您這樣做,可能會從審計角度產生負面影響。

+0

感謝您的信息。我已經閱讀過有關性能問題,如果應用程序複製類並永久保存它們,這對我來說是有意義的。但是,如果你說它沒有那麼多的命中,我可以用它。 –

+0

我正在從另一個系統遷移,這個系統也進行了審計,但僅限於更改。我曾計劃將這些更改手動遷移到審計表中。這是可取的嗎?您只會創建更改記錄,還是應該創建最舊的修訂版作爲添加記錄? –

+0

如果您清楚瞭解審計表模式以及修訂版號如何工作等,那麼您肯定可以將舊審計歷史記錄遷移到Envers模式。您只需將舊系統中的第一個更改條目作爲「ADD」和其他「MOD」進行創建。當然,如果所有這些遺留信息都不重要,那麼如果您願意(假設最後一個遺留更改=當前記錄快照),您肯定可以將最後一個條目作爲「ADD」進行遷移。 – Naros