2017-10-17 6 views
0

Je suis un vrai débutant dans le combo Hibernate (4.2) + Spring chargé de travailler sur une sous-application qui les utilise pour faciliter la gestion de CRUD dans un portail administrateur, donc je me perds probablement à un niveau très basique .Comment devrais-je visualiser les données collectées par Envers?

J'ai chargé Hibernate-Envers dans le projet pour effectuer une journalisation d'audit sur un champ @Entity spécifique. Après avoir ajouté @Audited à cela, Envers fonctionne comme prévu, en ajoutant des données dans la table _aud.

Mon but est d'afficher une liste de toutes les révisions de cette entité pour les administrateurs. Je ne suis pas sûr de savoir comment je devrais y aller.

Ce que j'ai essayé jusqu'à présent est ..

  1. Créer une nouvelle classe Repository que je l'imaginais utiliserait le AuditReader pour fournir une liste de toutes les révisions par un nouveau service . Cependant, je ne pouvais pas faire ce travail sans ajouter une nouvelle entité pour l'objet Histoire lui-même - et je pensais que c'était probablement pas le chemin à parcourir.
  2. Essayez d'utiliser un AuditReader dans le contrôleur existant pour l'Entité. Pour la création d'un AuditReader, j'avais besoin d'une sessionFactory que j'ai essayé d'activer automatiquement dans le contrôleur, mais cela s'est avéré ne pas être la bonne chose, car l'autowiring a échoué.

Quelle est la structure préférée pour recueillir des données à partir des tables de * Envers _aud pour les montrer aux utilisateurs finaux sur une page Web?

Répondre

1

Créer une nouvelle classe de Repository que j'imaginais utiliser l'AuditReader pour fournir une liste de toutes les révisions via un nouveau Service. Cependant, je ne pouvais pas faire ce travail sans ajouter une nouvelle Entité pour l'objet Histoire lui-même - et je pensais que ce n'était probablement pas le chemin à parcourir.

Supposons que nous avons une entité de base vraiment stupide comme ceci:

@Entity 
@Audited 
public class BasicEntity { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 
    ... 
} 

Vous devriez être en mesure de construire deux composants du stockage/dao que les deux utilisent BasicEntity comme le type d'entité, mais à la fois fonctionnent en interne très différemment avec ces instances.

votre composant du référentiel d'affaires aurait Session ou EntityManager injecté et vous utiliser pour manipuler ces instances d'appel #persist, #merge, etc.

votre composant du référentiel d'audit aurait également injecté Session ou EntityManager mais utiliserait ce pour construire un AuditReader et interroger les tables d'audit.

@Component 
public interface BasicEntityAuditRepository implements AuditRepository<BasicEntity> { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Override 
    public List<BasicEntity> findByRevision(Long id, Number revision) { 
    final AuditReader auditReader = AuditReaderFactory.get(entityManager); 
    // build whatever query and return the results. 
    } 

} 

public interface AuditRepository<T> { 
    List<T> findByRevision(Long id, Number revision); 
}