我有一个由 Hibernate 加载的实体(通过 EntityManager
):
User u = em.load(User.class, id)
该类(class)由 Hibernate Envers 审核。如何加载以前版本的用户实体?
最佳答案
这是找到相对于“当前”修订号的先前修订的另一个版本,因此即使您正在查看的实体不是最新修订也可以使用它。它还处理没有先前修订的情况。 (em
被假定为先前填充的 EntityManager)
public static User getPreviousVersion(User user, int current_rev) {
AuditReader reader = AuditReaderFactory.get(em);
Number prior_revision = (Number) reader.createQuery()
.forRevisionsOfEntity(User.class, false, true)
.addProjection(AuditEntity.revisionNumber().max())
.add(AuditEntity.id().eq(user.getId()))
.add(AuditEntity.revisionNumber().lt(current_rev))
.getSingleResult();
if (prior_revision != null)
return (User) reader.find(User.class, user.getId(), prior_revision);
else
return null
}
这可以概括为:
public static T getPreviousVersion(T entity, int current_rev) {
AuditReader reader = AuditReaderFactory.get(JPA.em());
Number prior_revision = (Number) reader.createQuery()
.forRevisionsOfEntity(entity.getClass(), false, true)
.addProjection(AuditEntity.revisionNumber().max())
.add(AuditEntity.id().eq(((Model) entity).id))
.add(AuditEntity.revisionNumber().lt(current_rev))
.getSingleResult();
if (prior_revision != null)
return (T) reader.find(entity.getClass(), ((Model) entity).id, prior_revision);
else
return null
}
这种概括的唯一棘手之处是获取实体的 ID。因为我正在使用 Play!框架,我可以利用所有实体都是模型这一事实并使用 ((Model) entity).id
来获取 id,但您必须调整它以适应您的环境。
关于java - 在 Hibernate Envers 中获取以前版本的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/793674/