• В иерархии наследования, если слушатели определены для множественных сущностей, слушатели, определенные в суперклассе, вызываются раньше слушателей, определенных в подклассах. Если не требуется, чтобы сущность наследовала слушателей суперкласса, то можно явным образом исключить их, используя аннотацию @ExcludeSuperclassListeners (или ее XML-эквивалент).

В листинге 6.41 показан код сущности Customer, где определяется два слушателя, однако слушатель может быть определен и для нескольких сущностей. Это может оказаться полезным в ситуациях, где слушатель обеспечивает общую логику, из которой могут извлечь выгоду многие сущности. Например, вы могли бы создать DebugListener, который будет выводить имена отдельных инициируемых событий, как показано в листинге 6.42.

Листинг 6.42. DebugListener, который может быть использован любой сущностью

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, и произвести его развертывание с использованием приложения.

Листинг 6.43. DebugListener, определенный в качестве слушателя по умолчанию

·················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">

···

······

·········

············

·········

······

···

В этом файле тег определяет все метаданные, у которых нет какого-либо эквивалента в виде аннотаций. Тег задает все настройки по умолчанию для единицы сохраняемости, а тег определяет слушателя по умолчанию. В persistence.xml должна иметься ссылка на этот файл, развертывание которого необходимо выполнить с использованием приложения. Тогда DebugListener будет автоматически вызываться для каждой сущности.

Если вы объявите список слушателей сущности по умолчанию, то каждый из них будет вызываться в том порядке, в котором они указаны в файле отображения XML. Слушатели сущности по умолчанию всегда вызываются раньше любых слушателей сущности, определенных в аннотации @EntityListeners. Если потребуется, чтобы для сущности не применялись слушатели по умолчанию, то можно использовать аннотацию @ExcludeDefaultListeners, как показано в листинге 6.44.

Листинг 6.44. Сущность Customer, для которой исключаются слушатели по умолчанию

@ExcludeDefaultListeners

@Entity

public class Customer {

··@Id @GeneratedValue

··private Long id;

··private String firstName;

··private String lastName;

··private String email;

··private String phoneNumber;

Перейти на страницу:

Похожие книги