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

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

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

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

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

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

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

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

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


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

private String name;

@PreUpdate
private void beforeUpdate() {
System.out.println("Before updating user: " + this.name);
if (this.name == null) {
this.name = "DEFAULT_NAME";
}
}

@PostUpdate
private void afterUpdate() {
System.out.println("User updated with ID: " + this.id);
}
}


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

@PreUpdate:
Вызывается перед выполнением операции update в EntityManager.
Используется для валидации или модификации данных перед обновлением.
Пример: проверка обязательных полей, обновление временных меток.


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


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

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

private String name;
}

public class UserListener {
@PreUpdate
public void beforeUpdate(User user) {
System.out.println("Before updating user: " + user.getName());
}

@PostUpdate
public void afterUpdate(User user) {
System.out.println("User updated with ID: " + user.getId());
}
}


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

Использование в сущности:
Методы @PreUpdate и @PostUpdate можно определить непосредственно в сущности.

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

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

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

@PostUpdate
public void afterUpdate(Object entity) {
System.out.println("Entity updated: " + entity.getClass().getSimpleName());
}
}


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


#Java #Training #Hard #Spring #SpringDataJPA #PreUpdate #PostUpdate