如何从Hibernate Envers的RevisionEntity获取RevisionType?

时间:2016-03-24 00:35:45

标签: java hibernate hibernate-envers

我有简单的审计实体和Am使用envers来跟踪特定字段的更改。

我有必要区分Entity + RevisionEntity的RevisionType:如果它是MOD,ADD或DEL。

如何用envers实现这个目标?

我知道信息是AUD表,但我无法通过常规映射检索它。

1 个答案:

答案 0 :(得分:0)

我最终使用自定义的RevisionEntity + RevisionEntityListener来实现此行为:

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);
    }
}

我的修订实体:

@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());
    }
}

此解决方案基本上跟踪在该修订版中更改/添加/删除的每个实体类+ id,并查询它以了解哪个RevisionType标记该给定实体的修订版。