Spring Data JPA — отслеживание изменений в сущностном классе (Spring Data JPA Auditing)

Аудит изменений в сущностном классе с помощью Spring Data JPA Auditing. 

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

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

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

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

Spring data jpa audit structure

Весь проект основан на статье Spring Data JPA – пример приложения Hello World. Здесь будут описываться только необходимые изменения для включения функции аудита. Поэтому рекомендую ознакомиться с указанной статьей, чтобы было понятно о чем идет речь.

В проекте добавлены: ContactAuditEntity — сущность таблицы для тестирования аудита, ContactAuditService — интерфейс для методов вставки, сохранения и обновления, ContactAuditRepository — интерфейс, расширяющий CrudRepository<T, ID>ContactAuditServiceImpl — реализация интерфейса, AuditorAwareBean — бин для предоставления информации о пользователе, который вносит изменения.

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

Зависимости в pom.xml немного изменились относительно предыдущего проекта:

Важно отметить, что для Hibernate версии 4+ используются другие зависимости, чем для версии старше 4.0 (например для Hibernate 3.6). Для JodaTime теперь нужно подключать вот эту библиотеку:

Для Hibernate <4.0 была:

Но с ней данный проект не запустится!

4. Таблица ContactAudit, создание сущности ContactAuditEntity

Создадим новую таблицу, которая очень похожа на ContactEntity из прошлой статьи, но с добавлением 4 переменных для аудита:

Получим такую схему:

Spring data jpa schema

Теперь создадим сущность для новой таблицы:

AuditEntity

Листинг ContactAuditEntity:

Сущность реализует интерфейс Auditable<U,ID>, который необходим для работы с изменениями в классе сущности (даты создания-изменения и имя пользователя, создавшего-изменившего сущность). Обычно первым параметром туда передается какой-либо класс, имеющий информацию о пользователе (например User.class), но здесь будет передана жестко прописанная строка. Методы Auditable:

Обратите внимание на метод isNew() в классе сущности (из интерфейса Persistable<ID>) — он будет влиять на определение является ли сущность новой или ее изменяют. Остальные методы работают согласно названиям.

4.1 Дополнительно о Hibernate 4+

Для Hibernate 4+ используем  @Type(type=»org.jadira.usertype.dateandtime.joda.PersistentDateTime»)

Для Hibernate <4 — @Type(type=»org.joda.time.contrib.hibernate.PersistentDateTime»), а так же другую библиотеку из описания pom.xml выше.

5. Интерфейсы и реализация классов для операций с БД

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

Интерфейс репозиторий ContactAuditRepository. Все необходимые методы уже есть в родительском интерфейсе CrudRepository, поэтому оставляем его пустым:

Реализация интерфейса:

Обратить внимание можно разве что на метод findOne(id) — поиск одной записи по id. Так этот метод назван в CrudRepository.

6. Объявление слушателей AuditingEntityListener<T>

Необходимо объявить слушателей для классов сущностей, чтобы кто-то мог отслеживать изменения в них. Для этого сначала необходимо создать orm.xml настройку (такое имя обязательно — указано в спецификации JPA). Это можно сделать с помощью среды разработки в настройках проекта.

Spring data jpa orm

Обратите внимание, что файл в этом проекте находится в resources/META-INF/orm.xml.

Листинг orm.xml:

6.1. Настройка spring-config.xml

Все настройки взяты из предыдущего проекта. Приведу только изменения, необходимые для аудита:

6.2. Бин AuditorAware

В настройках spring указан бин, который реализует необходимый для аудита интерфейс AuditorAware. Листинг AuditorAwareBean:

Здесь обычно предоставляют данные о пользователе и вместо строки в интерфейс передается что-то вроде User.class. У нас же жестко прописана строчка, которая будет подставляться в колонки CREATED_BY, LAST_MODIFIED_BY.

7. Тестирование аудита изменений в классах сущностей

Создаем контакт, вставляем в таблицу. Затем изменяем контакт с id = 1.

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

8. Проблема со временем обновления

Обратите внимание на время, которое указывается в обновлении:

CREATED_DATE = «2015-10-11 21:06:38» ; LAST_MODIFIED_DATE = «2015-10-11 18:06:38». Решение уже в другой статье.

Может быть интересно

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

Hibernate Envers – отслеживание версий (ревизий) класса сущности и извлечение ее хронологии

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

Spring Data JPA Audit SQL -sql MySQL

Spring Data JPA — Audit — src

Share Button
4
11104 Total Views 1 Views Today

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