Spring Data JPA Auditing + Hibernate Envers — аудит изменения записи и сохранение ее версий

Рассмотрим пример аудита изменений сущности, а так же сохранение каждой её версии.

Используемые технологии
  • Spring 4.1.5.RELEASE
  • Spring Data JPA Gosling Release (1.9)
  • Hibernate 5.0.1.Final ( + Hibernate Envers)
  • JPA 2.1
  • MySQL 5.6.25
  • IntelliJ IDEA 14
  • Maven 3.2.5

1. Описание задачи

Необходимо подружить вместе Spring Data JPA Auditing и модуль Hibernate Envers. Первый отвечает за аудит изменений в сущности и пишет параметры: created_by, created_date, last_modified_by, last_modiefied_date (кто и когда создал, кто и когда изменил в последний раз). Hibernate Envers сохраняет версии (ревизии) каждой измененной сущности (для этого нужны еще две дополнительных таблицы), но он позволяет вытащить любую версию, например по id.

2. Структура проекта

В этой статье будут рассмотрены только настройки, которые позволят нам отcлеживать изменения в сущностях. Подробная информация есть в двух базовых статьях по фреймворкам:  Spring Data JPA – отслеживание изменений в сущностном классе (Spring Data JPA Auditing) и Hibernate Envers – отслеживание версий (ревизий) класса сущности и извлечение ее хронологии. Если вы не знакомы с этими технологиями, то вначале рекомендую прочитать эти статьи.

Spring data jpa audit structure

Структура осталась такой же, как и для примера аудита в Spring Data JPA. Таблицы выглядят так (что добавлено было описано в статье по Hibernate Envers):

Hibernate envers tables

 

3. Настройки pom.xml

4. Настройки spring-context.xml

5. Листинг сущности для аудита и версионирования

ContactAuditEntity (этот вид окончательно сущность приняла в статье о Hibernate Envers, указанной вначале):

6. Интерфейс и реализация методов обращения к БД

Интерфейс ContactAuditService:

Его реализация ContactAuditServiceImpl (изменена относительно Hibernate Envers и Spring Data JPA Auditing):

7. Тестирование

Обращаю ваше внимание, что если запускать код именно так, то будут вылазить ошибки или дубликатов записей, отсутствия записи и т.п.. Вам нужно комментировать часть кода (например после первой вставки выключить первый вызов save() ). Так же смотрите на id и номер ревизии, который вызывается в конце этого кода.

Примерный вывод:

Как видите сохранилась вся необходимая информация об изменениях в записи, а так же доступны различные ревизии (номера 11 и 13).

Исходные коды

Spring Data JPA Audit Hibernate Envers SQL -sql

Spring Data JPA Audit +Hibernate Envers — src

Share Button
3
7771 Total Views 1 Views Today

Добавить комментарий