Вот еще одна версия, которая находит предыдущую ревизию относительно «текущего» номера ревизии, поэтому ее можно использовать, даже если просматриваемая сущность не является последней ревизией. Он также обрабатывает случай, когда не является предыдущей ревизией. (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
}
Единственный сложный момент с этим обобщением - получение идентификатора сущности. Потому что я использую Play! Framework, я могу использовать тот факт, что все сущности являются моделями и использовать ((Model) entity).id
для получения идентификатора, но вам придется изменить это в соответствии с вашей средой.