Search code examples
javahibernatehibernate-envers

How to get RevisionType from RevisionEntity with Hibernate Envers?


I have simple Audited entity and Am using envers to track changes on a specif field.

I have the necessity to distinguish between an Entity + RevisionEntity's RevisionType: if it is either MOD, ADD or DEL.

How to achieve this with envers?

I know that the info is the AUD tables, but Am unable to retrieve it via regular mapping.


Solution

  • I ended up using a custom RevisionEntity + RevisionEntityListener in order to achieve this behaviour:

    public class UsuarioRevisionListener implements RevisionListener, EntityTrackingRevisionListener {
    
        @Override
        public void newRevision(Object revisionEntity) {
        }
    
        @Override
        public void entityChanged(Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) {
            UsuarioRevisionEntity revision = (UsuarioRevisionEntity) revisionEntity;
            revision.getEntityRevType().put(UsuarioRevisionEntity.chave(entityClass,entityId), revisionType);
        }
    }
    

    And my revision entity:

    @Entity
    @RevisionEntity(UsuarioRevisionListener.class)
    public class UsuarioRevisionEntity extends DefaultTrackingModifiedEntitiesRevisionEntity {
    
        private static final long serialVersionUID = 4211821630661371266L;
    
        @ElementCollection(fetch=FetchType.EAGER)
        @Enumerated(EnumType.STRING)
        @Column(name="REVTYPE")
        @MapKeyColumn(name="NAMEID")
        @CollectionTable(name="ENT_REVTYPE", joinColumns=@JoinColumn(name="REV"))
        @Getter @Setter
        private Map<String,RevisionType> entityRevType = new HashMap<>();
    
        public <T extends Entidade> Optional<RevisionType> getRevType(T entity) {
            return Optional.fromNullable(entityRevType.get(chave(entity.getClass(),entity.getId())));
        }
    
        public static String chave(Class entityClass, Serializable entityId) {
            return String.format("%s-%s",entityClass.getSimpleName(),entityId.toString());
        }
    }
    

    This solution basically keeps track of each entity class+id that was changed/added/deleted at that Revision and queries it to know which RevisionType marks that Revision for a given Entity.