2017-09-28 11 views
1

結合表を監査しないで、監査表に結合列値を保存しようとしています。hibernate-envers onetomany結合クラスは監査されませんが、結合列は監査する必要があります

ここに私のエンティティクラスがあります。

監査済クラスINFO:

@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; 

} 

は、詳細情報があります静的...変化しない...したがって、監査する必要はありません....しかし、INFOの変更を監査すると、名前と姓の両方をキャプチャするINFO_AUDテーブル...これを指定する方法はありますか?

ありがとう、 Joe。

答えて

0

したいフィールドが主キーの一部であるので、あなたは非常に簡単に特別監査注釈属性を指定することによってこれを行うことができます。要するに

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

を、これは関連するエンティティDetailsではないことEnversに指示監査対象事業体。ただし、監査スキーマは、関連するエンティティの主キー列のスナップショットを取る必要があります。

Info_AUDには、details_FIRST_NAMEdetails_LAST_NAMEという名前の値を表す2つの列があると想定してください。

オブジェクトに関連付けられたInfoを変更すると、履歴列のスナップショットで名前列が更新されるように、Enversはデータモデルに特別な操作を行う必要はありません。

+0

ナロス、上記の解決策を試しました...しかし、監査テーブルのfirst_nameとlast_nameはまだ入力されていません... また、私の前提はあなたのコードでありました.. details.getId()メソッドはdetails.getDetailsPK()メソッドです。私はgetterとsetterをINFOエンティティのシャドウカラムに追加しました。 アドバイス...詳細設定ツールでresolveAuditedShadowColumnsメソッドが必要な理由を詳しく説明してください... 私は完全に新しいものであり、そのことを理解しようとしているので、事前にお詫び申し上げます... – Joe

+0

@ジョー私は完全に答えを書き換えた。私の以前の答えは少し複雑で、実験をした後でした。私はあなたのニーズにきちんと適合し、不要なオーバーヘッドを避ける優れたソリューションを見つけました。 – 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列はありません。 – Joe

関連する問題