Java for Beginner
675 subscribers
559 photos
156 videos
12 files
856 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации @PrePersist и @PostPersist

Аннотации @PrePersist и @PostPersist используются в Java Persistence API (JPA) для указания методов обратного вызова (callback), которые выполняются до и после сохранения сущности в базу данных. Они находятся в пакете javax.persistence (или jakarta.persistence в Jakarta EE).

@PrePersist: Метод, аннотированный @PrePersist, вызывается перед тем, как сущность будет сохранена в базу данных (перед выполнением persist).
@PostPersist: Метод, аннотированный @PostPersist, вызывается после того, как сущность была успешно сохранена в базу данных (после выполнения persist).

Эти аннотации полезны для выполнения дополнительной логики, например, инициализации значений, валидации или логирования, до или после сохранения сущности.

Параметры и настройки

Аннотации @PrePersist и @PostPersist не принимают параметров. Они применяются к методам сущности, которые должны быть вызваны в соответствующий момент жизненного цикла сущности.

Требования к методам:

Метод должен быть void и не принимать параметров.
Метод может иметь любой модификатор доступа (public, protected, private).
Метод не должен быть статическим.


Пример использования:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

@PrePersist
private void beforePersist() {
System.out.println("Before persisting user: " + this.name);
if (this.name == null) {
this.name = "DEFAULT_NAME";
}
}

@PostPersist
private void afterPersist() {
System.out.println("User persisted with ID: " + this.id);
}
}


Жизненный цикл

@PrePersist:
Вызывается перед выполнением операции persist в EntityManager.
Используется для инициализации или валидации данных перед сохранением.
Пример: установка значений по умолчанию, генерация UUID, проверка обязательных полей.


@PostPersist:
Вызывается после успешного выполнения операции persist и фиксации транзакции.
Используется для выполнения действий после сохранения, например, логирования или отправки уведомлений.
Пример: логирование ID сохраненной сущности, отправка события в систему сообщений.


Логирование жизненного цикла:

Для отладки можно включить логирование жизненного цикла сущностей через Hibernate:
spring.jpa.properties.hibernate.ejb.event.post-persist=org.hibernate.event.internal.DefaultPersistEventListener


Кастомизация событий:
Если требуется более сложная обработка событий, можно использовать @EntityListeners для определения слушателей сущностей.

Пример использования @EntityListeners:
@Entity
@EntityListeners(UserListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
}

public class UserListener {
@PrePersist
public void beforePersist(User user) {
System.out.println("Before persisting user: " + user.getName());
}

@PostPersist
public void afterPersist(User user) {
System.out.println("User persisted with ID: " + user.getId());
}
}


Варианты настройки

Использование @EntityListeners:
Для разделения логики можно вынести методы обратного вызова в отдельный класс и использовать @EntityListeners.

Глобальные слушатели:
Для применения логики ко всем сущностям можно зарегистрировать глобальный слушатель через Hibernate.

Пример глобального слушателя:
public class GlobalEntityListener {
@PrePersist
public void beforePersist(Object entity) {
System.out.println("Before persisting entity: " + entity.getClass().getSimpleName());
}

@PostPersist
public void afterPersist(Object entity) {
System.out.println("Entity persisted: " + entity.getClass().getSimpleName());
}
}


Регистрация глобального слушателя в Hibernate:
spring.jpa.properties.hibernate.ejb.event.pre-persist=com.example.GlobalEntityListener
spring.jpa.properties.hibernate.ejb.event.post-persist=com.example.GlobalEntityListener


#Java #Training #Hard #Spring #SpringDataJPA #PrePersist #PostPersist