JPA Внутренние методы обратного вызова. Внутренние методы обратного вызова - это методы, которые определены в классе сущности.Например, следующий класс сущности определяет все поддерживаемые методы обратного вызова с пустыми реализациями:
@Entity
public static class MyEntityWithCallbacks {
@PrePersist void onPrePersist() {}
@PostPersist void onPostPersist() {}
@PostLoad void onPostLoad() {}
@PreUpdate void onPreUpdate() {}
@PostUpdate void onPostUpdate() {}
@PreRemove void onPreRemove() {}
@PostRemove void onPostRemove() {}
}
Внутренние методы обратного вызова всегда должны возвращать void и не принимать аргументов.Они могут иметь любое имя и любой уровень доступа (открытый, защищенный, пакетный и частный), но не должны быть статическими.
Аннотация указывает, когда вызывается метод обратного вызова:
@PrePersist - before a new entity is persisted (added to the EntityManager).
@PostPersist - after storing a new entity in the database (during commit or flush).
@PostLoad - after an entity has been retrieved from the database.
@PreUpdate - when an entity is identified as modified by the EntityManager.
@PostUpdate - after updating an entity in the database (during commit or flush).
@PreRemove - when an entity is marked for removal in the EntityManager.
@PostRemove - after deleting an entity from the database (during commit or flush).
AnКласс сущности может включать методы обратного вызова для любого подмножества или комбинации событий жизненного цикла, но не более одного метода обратного вызова для одного и того же события.Однако один и тот же метод можно использовать для нескольких событий обратного вызова, пометив его более чем одной аннотацией.
По умолчанию метод обратного вызова в классе супер сущностей также вызывается для объектов сущностей подклассов, если только этот обратный вызовметод переопределяется подклассом.
Ограничения реализации Чтобы избежать конфликтов с исходной операцией базы данных, которая инициирует событие жизненного цикла объекта (которое все еще выполняется), методы обратного вызова не должны вызывать методы EntityManager или Query и не должны обращаться к каким-либодругие объекты сущности.
Если метод обратного вызова выдает исключение в активной транзакции, транзакция помечается для отката, и для этой операции больше не вызывается никаких методов обратного вызова.