在Hibernate Envers中获取以前版本的实体

raz*_*nha 10 java jboss hibernate hibernate-envers

我有一个由Hibernate(via EntityManager)加载的实体:

User u = em.load(User.class, id)
Run Code Online (Sandbox Code Playgroud)

该课程由Hibernate Envers审核.如何加载以前版本的用户实体?

Bra*_*ace 23

这是另一个版本,它找到相对于"当前"版本号的先前版本,因此即使您正在查看的实体不是最新版本,也可以使用它.它还处理没有事先修订的情况.(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
}
Run Code Online (Sandbox Code Playgroud)

这可以推广到:

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
}
Run Code Online (Sandbox Code Playgroud)

这种泛化的唯一棘手的一点是获得实体的id.因为我正在使用Play!框架,我可以利用所有实体都是模型并用于((Model) entity).id获取id 的事实,但你必须调整它以适应你的环境.


Jas*_*n S 10

也许这就是(来自AuditReader文档)

AuditReader reader = AuditReaderFactory.get(entityManager);
User user_rev1 = reader.find(User.class, user.getId(), 1);

List<Number> revNumbers = reader.getRevisions(User.class, user_rev1);
User user_previous = reader.find(User.class, user_rev1.getId(),
  revNumbers.get(revNumbers.size()-1));
Run Code Online (Sandbox Code Playgroud)

(我对此非常新,不确定我是否拥有正确的语法,也许大小() - 1应该是size() - 2?)