Таблица аудита Envers не откатывается в тестах интеграции с весенней загрузкой, аннотированных @Transactional - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь выяснить, почему @Transactional не выполняет откат данных в таблице аудита envers после каждого теста и как это исправить. Как я могу это сделать в весенних интеграционных тестах?

Я пробовал с @DirtiesContext, и это заставляет его работать, но это скорее обходной путь и делает тесты намного более длинными, что мне не нравится.

Кто-нибудь из вас знает, как заставить это работать?

1 Ответ

0 голосов
/ 08 апреля 2019

Hibernate Envers выступает в качестве решения для аудита во время транзакции. В конечном итоге это означает, что все постоянные изменения, которые происходят во время транзакции, проверяются и набор операций рабочего блока кэшируется в памяти. Короче говоря, единственный раз, когда Envers сбрасывает операции в схему аудита, непосредственно перед фиксацией успешной транзакции.

Так как же все это работает с точки зрения гибернации?

Hibernate Envers регистрирует 2 очень важные операции обратного вызова с Hibernate ORM, когда обнаружена транзакция, которая работает на проверяемом объекте, до и после обратного вызова завершения транзакции. Обратный вызов до - это то, что фактически выполняет сброс изменений аудита в таблицы аудита, а после отвечает за очистку любых ресурсов, связанных с транзакцией.

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

Обратный вызов после всегда происходит независимо от состояния транзакции.

Может показаться, что @Transactional создает границу транзакции, а затем вызывается метод для выполнения своих операций, а когда метод завершается, аннотация вызывает фиксацию транзакции, ведущую к наблюдаемому поведению.

Я вижу несколько вариантов для вас:

  1. Переопределить поведение транзакции для тестов на только для чтения .
  2. Разработка тестов для очистки их тестовых данных после проверки тестового варианта использования.
  3. Разработка тестов для работы, даже если в таблицах имеются существующие тестовые данные.
  4. Отключить Envers через конфигурацию, если она не требуется в рамках этого интеграционного теста.
...