У нас есть требование: регистрировать и сохранять изменения сущности в транзакции в терминах diff с использованием Hibernate Envers.Мы реализовали RevisionListener
:
public class MyRevisionListener implements EntityTrackingRevisionListener {
@Override
public void newRevision(Object revision) {
...
}
@Override
public void entityChanged(Class entityClass,
String entityName,
Serializable entityId,
RevisionType revisionType,
Object revisionEntity) {
int revisionId = ((DefaultRevisionEntity) revisionEntity).getId();
List<?> revisions = AuditReaderFactory.get(entityManager)
.createQuery()
.forRevisionsOfEntity(entityClass, false, true)
.add(AuditEntity.id().eq(entityId))
.add(AuditEntity.revisionNumber().le(revisionId + 1))
.addOrder(AuditEntity.revisionNumber().desc())
.setMaxResults(2)
.getResultList();
checkArgument(revisions.size() < 3, "Need at most two revisions: %s", revisions);
checkArgument(revisions.size() > 0, "Need at least one revision: %s", revisions);
// continue with diff calculation;
}
}
Вопросы:
1. Первое утверждение: нужна ли мне эта проверка?Имея вышеупомянутый запрос Возможно ли, что результат содержит более двух элементов?
2. Второе утверждение: я предполагаю, что для каждого изменения (INSERT / UPDATE / DELETE) есть хотя бы один снимок (или ревизия).Это правильно?Если да, то почему мои тестовые случаи (с операцией UPDATE) не выполняются случайно из-за этого сбоя подтверждения (что означает отсутствие моментального снимка).
Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.
ОБНОВЛЕНИЕ
Проблема была в Spring Test, контексте и управлении bean-компонентами (в частности, как я получаю EntityManager
).Я принял сообщение @Naros, так как он ответил на первый вопрос и дал ответ на второй вопрос:)