2017-09-28 143 views
1

我想在審計連接表時保存審計表中的連接列值。hibernate-envers onetomany加入類沒有審計,但連接列需要審計

這是我的實體類。

審計類信息:

@Entity 
@Audited 
@Table(name = "INFO") 
public class Info extends AbstractEntity { 

    @Id 
    @Column(name = "ID") 
    private String id; 

    /*More Columns */ 

    @ManyToOne 
    @JoinColumns({ @JoinColumn(name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"), 
     @JoinColumn(name = "LAST_NAME", referencedColumnName = "LAST_NAME") }) 
    @NotAudited 
    private Details details; 


} 

未經審計類:詳細信息:

@Entity 
@Table(name = "DETAILS") 
public class Details extends AbstractEntity { 

    @EmbeddedId 
    private DetailsPK detailsPK; 
    /*More Columns */ 

} 

主鍵/連接字段的定義如下:

@Embeddable 
public class DetailsPK implements Serializable { 

    @Column(name = "FIRST_NAME") 
    private String firstName; 

    @Column(name = "LAST_NAME") 
    private String lastName; 

} 

這裏,詳細信息靜態...它不會改變...因此,不需要審計......但是,當審計信息變化時,我想t INFO_AUD表來同時捕獲名字和姓氏......有沒有一種方法來指定它?

謝謝, 喬。

回答

0

既然你想要的字段是主鍵的一部分,你可以很容易地通過指定特別審計註釋屬性做到這一點:

@ManyToOne 
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
private Details details; 

總之,這指示Envers關聯實體Details不被審計單位;但是審計模式應該爲相關實體的主鍵列創建一個快照。

因此您應該預計Info_AUD有兩列,分別代表名稱值details_FIRST_NAMEdetails_LAST_NAME

因爲Envers會確保在更改與Info關聯的Details對象時,您不需要對數據模型執行任何其他操作,因此名稱列在歷史行快照中相應地更新。

+0

Naros,感謝您的幫助...我試過上述解決方案...但審計表中的first_name和last_name仍然沒有填充... 另外,我的假設是在您的代碼中.. 。details.getId()方法是details.getDetailsPK()方法。我將getter和setter添加到INFO實體的陰影列中。 請指教...請問您還可以詳細說明爲什麼我們需要在細節設置器中使用resolveAuditedShadowColumns方法... 我提前道歉,因爲我對envers完全陌生並試圖理解... – Joe

+0

@Joe我完全重寫了答案。我之前的回答有點複雜,經過一些實驗後,我發現了一個更好的解決方案,可以很好地滿足您的需求,並避免任何不必要的開銷。 – Naros

+0

在我發佈我的問題之前,我嘗試過這樣做,但它沒有工作......我重試以防萬一......並且它仍然無法正常工作....以下是我嘗試的代碼行。 @ManyToOne @JoinColumns({@JoinColumn(名稱= 「FIRST_NAME」,referencedColumnName = 「FIRST_NAME」), @JoinColumn(名稱= 「LAST_NAME」,referencedColumnName = 「LAST_NAME」)}) @Audited(targetAuditMode = RelationTargetAuditMode 。NOT_AUDITED) 私人詳情細節; 注:我的Info_Aud表具有FIRST_NAME和LAST_NAME列,但不包含details_First_name和details_last_name columsn。 – Joe