2017-09-28 5 views
1

Je suis en train d'enregistrer les valeurs des colonnes se joindre dans les tableaux de contrôle de la vérification effectuée pas la table de jointure.mise en veille prolongée-OneToMany Envers Rejoindre la classe non audités, mais les colonnes de jointure doivent être vérifiés

Voici mes classes d'entités.

Audited Classe 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; 


} 

Classe non auditées: Détails:

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

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

} 

champs de clé primaire/inscription sont définies ici:

@Embeddable 
public class DetailsPK implements Serializable { 

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

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

} 

Ici, les informations Détails est statique ... Cela ne change pas ... D'où, besoin d'être audité .... Mais, lors de la vérification des changements INFO, je wan t la table INFO_AUD pour capturer à la fois le prénom et le nom de famille ... Y at-il un moyen de le spécifier?

Merci, Joe.

Répondre

0

Puisque les champs que vous voulez font partie de la clé primaire, vous pouvez le faire très facilement en spécifiant un attribut d'annotation d'audit spécial:

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

En bref, cela indique Envers que l'entité associée Details n'est pas une entité auditée; cependant, le schéma d'audit doit prendre un instantané des colonnes de clé primaire de l'entité associée.

Vous devez donc attendre Info_AUD pour avoir deux colonnes qui représentent les valeurs nommées details_FIRST_NAME et details_LAST_NAME. Si vous modifiez l'objet Details associé à Info, les colonnes de nom sont mises à jour dans l'instantané de ligne historique en conséquence. Envers s'assurera que vous modifiez l'objet Details associé à Info.

+0

Naros, Merci pour votre aide ... J'ai essayé la solution ci-dessus ... Mais le prénom et le nom de famille dans les tables d'audit ne sont toujours pas remplis ... Aussi, mon hypothèse était que dans votre code .. La méthode details.getId() est la méthode details.getDetailsPK(). J'ai ajouté des getters et des setters aux colonnes fantômes de l'entité INFO. S'il vous plaît conseiller ... Pouvez-vous aussi, s'il vous plaît expliquer pourquoi nous avons besoin de la méthode resolveAuditedShadowColumns dans les détails setter ... J'excuse à l'avance, car je suis complètement nouveau pour essayer de et envers comprendre que ... – Joe

+0

@Joe j'ai complètement réécrit la réponse. Ma réponse précédente était un peu compliquée et après avoir fait quelques expériences; J'ai trouvé une meilleure solution qui s'adapte très bien à vos besoins et évite les frais inutiles. Je – Naros

+0

essayé de faire cela avant que je posté ma question et ça n'a pas marché ... Je retenté juste au cas où ... et il ne fonctionne toujours pas .... Ce qui suit est les lignes de code que j'ai essayé. @ManyToOne @JoinColumns ({@JoinColumn (name = "prenom", referencedColumnName = "prenom"), @JoinColumn (name = "LAST_NAME", referencedColumnName = "LAST_NAME")}) @Audited (targetAuditMode = RelationTargetAuditMode .NOT_AUDITED) private Détails detailles; Remarque: Ma table Info_Aud contient les colonnes FIRST_NAME et LAST_NAME mais pas details_First_name et details_last_name columsn. – Joe