2017-09-28 2 views
1

Ich versuche, die Join-Spalten Werte in den Audit-Tabellen zu speichern, während die Join-Tabelle nicht überwacht.Hibernate-Envers Onetomany Join-Klasse nicht auditiert, aber Join-Spalten müssen auditiert werden

Hier sind meine Entity-Klassen.

Geprüfter Klasse 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; 


} 

nicht geprüft Klasse: Details:

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

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

} 

Primary Key/Join Felder werden hier definiert:

@Embeddable 
public class DetailsPK implements Serializable { 

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

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

} 

Hier die Details der Informationen statisch ... Es ändert sich nicht ... Daher muss man auditiert werden .... Aber wenn sich das Auditing INFO ändert, werde ich schwach t In der Tabelle INFO_AUD werden sowohl der Vorname als auch der Nachname erfasst. Gibt es eine Möglichkeit, dies zu spezifizieren?

Vielen Dank, Joe.

Antwort

0

Da die Felder, die Sie Teil des Primärschlüssels wollen, können Sie ganz einfach das tun, indem eine spezielle Prüfung Anmerkung Attribut spezifiziert:

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

Kurz gesagt, dies weist Envers, dass die zugehörige Einheit Details nicht ist ein geprüftes Unternehmen; Das Überwachungsschema sollte jedoch einen Snapshot der Primärschlüsselspalten der verknüpften Entität erstellen.

So sollten Sie Info_AUD erwarten zwei Spalten zu haben, die die Namen Werte genannt details_FIRST_NAME und details_LAST_NAME darstellen.

Sie werden nichts anderes das mit Ihrem Datenmodell tun müssen, als Envers dafür sorgen, dass, wie Sie das Details Objekt Info assoziiert zu ändern, dass die Namen Spalten entsprechend in dem historischen Reihe Snapshot aktualisiert werden.

+0

Naros, Vielen Dank für Ihre Hilfe ... Ich habe die obige Lösung versucht ... Aber die first_name und last_name in den Audit-Tabellen sind bevölkert noch nicht ... Auch meine Annahme war, dass in Ihrem Code .. Die details.getId() -Methode ist die details.getDetailsPK() -Methode. Ich habe Getter und Setter zu den Schattenspalten in der INFO-Entität hinzugefügt. Bitte raten ... Können Sie auch bitte auf erarbeiten, warum wir die resolveAuditedShadowColumns Methode müssen die Details Setter ... ich im Voraus entschuldigen, wie ich envers völlig neu bin und versuchen, das zu verstehen ... – Joe

+0

@Joe Ich habe die Antwort komplett neu geschrieben. Meine vorherige Antwort war ein wenig verworren und nach ein paar Experimenten; Ich habe eine bessere Lösung gefunden, die sehr gut zu Ihren Bedürfnissen passt und unnötigen Overhead vermeidet. – Naros

+0

Ich habe versucht, dies zu tun, bevor ich meine Frage gepostet habe und es hat nicht funktioniert ... Ich habe versucht, nur für den Fall ... und es funktioniert immer noch nicht .... Das Folgende ist die Zeilen Code, die ich ausprobiert habe. @ManyToOne @JoinColumns ({@JoinColumn (name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"), @JoinColumn (name = "LAST_NAME", referencedColumnName = "LAST_NAME")}) @Audited (targetAuditMode = RelationTargetAuditMode .NOT_AUDITED) private Details Details; Hinweis: Meine Info_Aud-Tabelle hat die Spalten FIRST_NAME und LAST_NAME, aber nicht details_First_name und details_last_name columsn. – Joe

Verwandte Themen