如何使用 Hibernate Envers 从 RevisionEntity 获取 RevisionType?
How to get RevisionType from RevisionEntity with Hibernate Envers?
我有一个简单的审计实体,我正在使用 envers 来跟踪特定字段的变化。
我需要区分 Entity + RevisionEntity 的 RevisionType:如果它是 MOD、ADD 或 DEL。
如何用 envers 实现这个?
我知道该信息是 AUD 表,但无法通过常规映射检索它。
我最终使用自定义 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());
}
}
此解决方案基本上会跟踪每个实体 class+id 在该修订版中是 changed/added/deleted 并查询它以了解哪个 RevisionType 标记了给定实体的修订版。
我有一个简单的审计实体,我正在使用 envers 来跟踪特定字段的变化。
我需要区分 Entity + RevisionEntity 的 RevisionType:如果它是 MOD、ADD 或 DEL。
如何用 envers 实现这个?
我知道该信息是 AUD 表,但无法通过常规映射检索它。
我最终使用自定义 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());
}
}
此解决方案基本上会跟踪每个实体 class+id 在该修订版中是 changed/added/deleted 并查询它以了解哪个 RevisionType 标记了给定实体的修订版。