Аннотация @EnableJpaAuditing
Аннотация @EnableJpaAuditing активирует поддержку аудита сущностей JPA в Spring Data. Она позволяет автоматически отслеживать изменения в сущностях, такие как:
Кто создал или изменил запись (createdBy, lastModifiedBy).
Когда запись была создана или изменена (createdDate, lastModifiedDate).
Параметры аннотации
auditorAwareRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего интерфейс AuditorAware<T>. Этот бин предоставляет информацию о текущем пользователе (например, из Spring Security).
Пример:
dateTimeProviderRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего DateTimeProvider. Позволяет кастомизировать логику получения текущей даты/времени (например, для тестов).
Пример:
setDates (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, автоматическое обновление полей createdDate и lastModifiedDate отключается.
modifyOnCreate (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, поле lastModifiedDate не обновляется при создании сущности (только createdDate).
Жизненный цикл аудита
Инициализация
При старте приложения Spring ищет классы с @EnableJpaAuditing и регистрирует AuditingEntityListener.
Если указан auditorAwareRef, Spring внедряет соответствующий бин.
Сохранение/обновление сущности
Перед вставкой (@PrePersist) автоматически заполняются:
createdBy и createdDate (если поддерживается).
Перед обновлением (@PreUpdate) заполняются:
lastModifiedBy и lastModifiedDate.
Уничтожение
Аудит не влияет на удаление сущностей, но можно добавить @PreRemove логику вручную.
Механизмы Spring и настройки Spring Boot
1. Как работает аудит в Spring Data JPA?
AuditingEntityListener – JPA-колбек, который обрабатывает события @PrePersist и @PreUpdate.
AuditorAware – интерфейс для получения информации о текущем пользователе.
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy – аннотации для полей сущности.
2. Настройка сущности
3. Конфигурация Spring Boot
Если используется Spring Boot, можно не указывать @EnableJpaAuditing вручную, если:
Есть бин AuditorAware.
Включен spring.data.jpa.repositories.bootstrap-mode=default (по умолчанию).
Пример application.properties:
4. Интеграция с Spring Security
Если приложение использует Spring Security, AuditorAware может возвращать текущего пользователя:
Варианты настройки
Отключение аудита для отдельных полей
Не аннотировать поле @CreatedBy, если оно не нужно.
Кастомные даты
Реализовать DateTimeProvider, если требуется использовать не Instant.now(), а другую временную зону.
Аудит без Spring Security
Можно возвращать фиксированное значение (например, "system"):
#Java #Training #Hard #Spring #SpringDataJPA #EnableJpaAuditing
Аннотация @EnableJpaAuditing активирует поддержку аудита сущностей JPA в Spring Data. Она позволяет автоматически отслеживать изменения в сущностях, такие как:
Кто создал или изменил запись (createdBy, lastModifiedBy).
Когда запись была создана или изменена (createdDate, lastModifiedDate).
Параметры аннотации
auditorAwareRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего интерфейс AuditorAware<T>. Этот бин предоставляет информацию о текущем пользователе (например, из Spring Security).
Пример:
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of("admin"); // Возвращает текущего пользователя
}
}
dateTimeProviderRef (необязательный)
Тип: String
Описание: Указывает имя бина, реализующего DateTimeProvider. Позволяет кастомизировать логику получения текущей даты/времени (например, для тестов).
Пример:
@EnableJpaAuditing(dateTimeProviderRef = "customDateTimeProvider")
@Configuration
public class JpaConfig {
@Bean
public DateTimeProvider customDateTimeProvider() {
return () -> Optional.of(Instant.now());
}
}
setDates (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, автоматическое обновление полей createdDate и lastModifiedDate отключается.
modifyOnCreate (необязательный)
Тип: boolean
Значение по умолчанию: true
Описание: Если false, поле lastModifiedDate не обновляется при создании сущности (только createdDate).
Жизненный цикл аудита
Инициализация
При старте приложения Spring ищет классы с @EnableJpaAuditing и регистрирует AuditingEntityListener.
Если указан auditorAwareRef, Spring внедряет соответствующий бин.
Сохранение/обновление сущности
Перед вставкой (@PrePersist) автоматически заполняются:
createdBy и createdDate (если поддерживается).
Перед обновлением (@PreUpdate) заполняются:
lastModifiedBy и lastModifiedDate.
Уничтожение
Аудит не влияет на удаление сущностей, но можно добавить @PreRemove логику вручную.
Механизмы Spring и настройки Spring Boot
1. Как работает аудит в Spring Data JPA?
AuditingEntityListener – JPA-колбек, который обрабатывает события @PrePersist и @PreUpdate.
AuditorAware – интерфейс для получения информации о текущем пользователе.
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy – аннотации для полей сущности.
2. Настройка сущности
@Entity
@EntityListeners(AuditingEntityListener.class) // Включение аудита
public class User {
@Id
@GeneratedValue
private Long id;
@CreatedDate
private Instant createdDate;
@LastModifiedDate
private Instant lastModifiedDate;
@CreatedBy
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
3. Конфигурация Spring Boot
Если используется Spring Boot, можно не указывать @EnableJpaAuditing вручную, если:
Есть бин AuditorAware.
Включен spring.data.jpa.repositories.bootstrap-mode=default (по умолчанию).
Пример application.properties:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
4. Интеграция с Spring Security
Если приложение использует Spring Security, AuditorAware может возвращать текущего пользователя:
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getName);
}
Варианты настройки
Отключение аудита для отдельных полей
Не аннотировать поле @CreatedBy, если оно не нужно.
Кастомные даты
Реализовать DateTimeProvider, если требуется использовать не Instant.now(), а другую временную зону.
Аудит без Spring Security
Можно возвращать фиксированное значение (например, "system"):
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.of("system");
}
#Java #Training #Hard #Spring #SpringDataJPA #EnableJpaAuditing