• В иерархии наследования, если слушатели определены для множественных сущностей, слушатели, определенные в суперклассе, вызываются раньше слушателей, определенных в подклассах. Если не требуется, чтобы сущность наследовала слушателей суперкласса, то можно явным образом исключить их, используя аннотацию @ExcludeSuperclassListeners (или ее XML-эквивалент).
В листинге 6.41 показан код сущности Customer, где определяется два слушателя, однако слушатель может быть определен и для нескольких сущностей. Это может оказаться полезным в ситуациях, где слушатель обеспечивает общую логику, из которой могут извлечь выгоду многие сущности. Например, вы могли бы создать DebugListener, который будет выводить имена отдельных инициируемых событий, как показано в листинге 6.42.
public class DebugListener {
··@PrePersist
··void prePersist(Object object) {
····System.out.println("prePersist");
··}
··@PreUpdate
··void preUpdate(Object object) {
····System.out.println("preUpdate");
··}
··@PreRemove
··void preRemove(Object object) {
····System.out.println("preRemove");
··}
}
Обратите внимание, что каждый метод принимает Object в качестве параметра, а это означает, что сущность любого типа может использовать этот слушатель при добавлении класса DebugListener в свою аннотацию @EntityListeners. Чтобы любая сущность вашего приложения применяла этот слушатель, вам пришлось бы пройтись по каждой и добавить их вручную в аннотацию. На этот случай в JPA предусмотрено такое понятие, как слушатели по умолчанию, которые могут охватывать все сущности в контексте постоянства. Поскольку аннотация, нацеленная на всю область видимости единицы сохраняемости, отсутствует, слушатели по умолчанию могут быть объявлены только в файле отображения XML.
В предыдущей главе вы видели, как использовать файлы отображения XML вместо аннотаций. Для определения DebugListener в качестве слушателя по умолчанию придется выполнить те же самые шаги. Потребуется создать файл отображения с XML, определенным в листинге 6.43, и произвести его развертывание с использованием приложения.
·················xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
·················xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
·················http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd"
·················version="2.1">
···
······
·········
············
·········
······
···
В этом файле тег
Если вы объявите список слушателей сущности по умолчанию, то каждый из них будет вызываться в том порядке, в котором они указаны в файле отображения XML. Слушатели сущности по умолчанию всегда вызываются раньше любых слушателей сущности, определенных в аннотации @EntityListeners. Если потребуется, чтобы для сущности не применялись слушатели по умолчанию, то можно использовать аннотацию @ExcludeDefaultListeners, как показано в листинге 6.44.
@ExcludeDefaultListeners
@Entity
public class Customer {
··@Id @GeneratedValue
··private Long id;
··private String firstName;
··private String lastName;
··private String email;
··private String phoneNumber;