HIbernate Envers: получить снимки, вставленные в ту же транзакцию - PullRequest
0 голосов
/ 04 июня 2018

У нас есть требование: регистрировать и сохранять изменения сущности в транзакции в терминах 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, так как он ответил на первый вопрос и дал ответ на второй вопрос:)

1 Ответ

0 голосов
/ 04 июня 2018

Нужна ли эта проверка?Имея вышеупомянутый запрос Возможно ли, что результат содержит более двух элементов?

Нет, setMaxResults(2) гарантирует, что запрос вернет только максимум 2 строки;однако вам нужно будет обработать сценарий использования, когда запрос возвращает менее 2.

Я предполагаю, что для каждого изменения (INSERT / UPDATE / DELETE) есть хотя бы один снимок (или ревизия).Это правильно?Если да, то почему мои тестовые случаи (с операцией UPDATE) не выполняются случайным образом из-за этого сбоя утверждения (что означает отсутствие моментального снимка).

Я бы не ожидал, что ваш тестовый случай произойдет случайно, если вы не 'делаю то, чего не должно быть.Процесс аудита в Envers довольно детерминистический, поэтому я ожидаю, что он либо не удастся, либо будет успешным последовательно.

Что касается того, почему вы не получаете ожидаемое количество строк, я думаю, что это будет либо конфигурация сброса режиманаходится в игре, которая может помешать запросам аудита Envers или, возможно, вы запрашиваете схему аудита при сохранении сущности и ее ассоциаций, так что ожидаемый действительный предикат, в котором предложение является недействительным в данный момент?

Не видя вашегоТестовый случай, я могу только строить предположения по большей части.Если вы можете опубликовать свой тестовый набор и сопоставления сущностей, я мог бы покопаться немного глубже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...