2011-04-14 77 views

回答

26

如果您不希望根據價值/關係進行審覈,請在字段中使用NotAudited。我相信你可以在有或沒有關係的領域如OneToMany,ManyToMany或者Column上使用它。如果您希望值被審計,而不是關係另一端的實體,請在關係字段上使用RelationTargetAuditMode.NOT_AUDITED。例如,您希望審覈ID /鍵值,但不需要相關表格。

您也可以將RelationTargetAuditMode應用於整個類,我相信只是說類中的所有關係都不會審計另一端。這使我感到困惑,因爲我錯誤地使用這個註釋來表示不要審覈下面的實體,這不是它的意思。如果您不希望實體審計,那麼根本就沒有對實體類的審計註釋。在引用實體的其他審覈實體上,您必須將NotAudited或RelationTargetAuditMode.NOT_AUDITED用於關係字段。

官方文檔對這個主題不是很好(http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html),甚至根本沒有提到NotAudited。

在我過去的項目中,我需要審覈一組非常具體的表格,而不是其他人,所以我需要使用這些註釋。我與一些審計實體的非審計實體有外部關係。我經常使用RelationTargetAuditMode.NOT_AUDITED註釋,至少我會審覈外鍵值/ ID,而不是關係另一端的實體。如果你沒有這個註釋,你會得到一個運行時異常,其中ENVERS試圖將審計記錄插入到未審計實體的審計表中,並且該表不存在。我將NotAudited註釋用於幾個ManyToMany連接表關係,我不需要進行審計,並且審計實體表本身沒有任何記錄(無外鍵ID /值)。

哦是啊 - 文檔沒有說如果你同時使用(不知道哪一個有優先權)會發生什麼,但我不認爲同時在一個給定的字段上同時使用。使用一個或另一個。

+0

關於RelationTargetAuditMode.NOT_AUDITED註釋的非常有用的解釋。官方文檔在某些方面非常糟糕......謝謝! – 2017-01-16 09:27:00

36

審計目標實體及其關係是兩件不同的事情。所以這取決於你需要什麼。從Hibernate Envers - Easy Entity Auditing文檔:

如果要審覈的關係,在目標實體未經審計(也就是例如用字典的實體,不改變,並沒有這樣的情況審計),只需使用@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)對其進行註釋即可。然後,當閱讀您的實體的歷史版本時,關係將始終指向「當前」相關實體。

+0

我知道它的古老歷史,但是......在原始問題的情況下,他必須使用@NotAudited,因爲它是由目標實體處理的雙向關係:CustomerBooking。至少對於JPA 2.1 + Hibernate 4.3.10,@Audited(targetAuditMode = NOT_AUDITED)在這種情況下不起作用。 – pakman 2015-11-03 23:02:32

+4

這個答案沒有解釋NotAudited與RelationTargetMode.Not_AUDITED之間的區別。它不指示何時使用一個。 – Ryan 2016-07-08 14:29:43