2016-10-19 1 views
0

J'ai écrit ma classe RevisionEntity personnalisée pour stocker des données supplémentaires (par exemple le nom d'utilisateur), comme ci-dessous:Hibernate Envers - RevisionEntity personnalisé - comment obtenir dossier

@Entity 
@RevisionEntity(AuditListener.class) 
@Table(name = "REVINFO", schema = "history") 
@AttributeOverrides({ 
     @AttributeOverride(name = "timestamp", column = @Column(name = "REVTSTMP")), 
     @AttributeOverride(name = "id", column = @Column(name = "REV")) }) 
public class AuditEntity extends DefaultRevisionEntity { 

    private static final long serialVersionUID = -6578236495291540666L; 

    @Column(name = "USER_ID", nullable = false) 
    private Long userId; 

    @Column(name = "USER_NAME") 
    private String username; 

    public Long getUserId() { 
     return userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

je peux voir que toutes les lignes de base de données sont correctement stocké, la table REVINFO contient également le nom d'utilisateur.

Je voudrais interroger la base de données pour obtenir des informations détaillées de mon RevisionEntity personnalisé, comme nom d'utilisateur. Comment puis-je le faire? Existe-t-il une API prise en charge pour l'obtenir?

Répondre

2

laisse supposer que vous connaissez l'identifiant de l'entité que vous êtes intéressé par les métadonnées d'entité de révision, vous pouvez facilement vérifier que les informations en utilisant l'approche suivante:

final AuditReader auditReader = AuditReaderFactory.get(session); 
List<?> results = auditReader.createQuery() 
    .forRevisionsOfEntity(YourEntityClass.class, false, false) 
    .add(AuditEntity.id().eq(yourEntityClassId)) 
    .getResultList(); 

Les résultats retournés contiendra un tableau d'objets , par exemple Object[]results[1] contiendra l'instance d'entité de révision qui contient les informations pertinentes que vous souhaitez.

Pour plus de détails, vous pouvez consulter la documentation java commentaires here

Si vous avez seulement le numéro de révision, vous pouvez accéder à tout l'instance d'entité de révision directement par:

// I use YourAuditEntity here because AuditEntity is actually an Envers class 
YourAuditEntity auditEntity = auditReader 
    .findRevision(YourAuditEntity.class, revisionId); 

Pour plus de détails sur l'interface AuditReader, vous pouvez voir la documentation java here

+0

Je suppose que par 'YourEntityClass.class' vous ne voulez pas dire auditEntity.class', non? Je n'ai pas 'YourEntityClass.class' ni' yourEntityClassId', je n'ai que 'revisionId'. Et l'OMI devrait suffire pour obtenir l'objet commun d'audit. – bontade

+1

Mise à jour en référence à une API qui prend uniquement le type de classe d'entité de révision et le numéro de révision, comme vous l'avez indiqué. – Naros

+0

Merci beaucoup! Ça marche – bontade