Читаем Изучаем Java EE 7 полностью

····int adjust = 0; if (now.get(DAY_OF_YEAR) — birth.get(DAY_OF_YEAR) < 0) {

······adjust = -1;

····}

····customer.setAge(now.get(YEAR) — birth.get(YEAR) + adjust);

··}

}

Листинг 6.40. Слушатель, используемый для валидации атрибутов сущности Customer

public class DataValidationListener {

··@PrePersist

··@PreUpdate

··private void validate(Customer customer) {

····if (customer.getFirstName() == null || "".equals(customer.getFirstName()))

······throw new IllegalArgumentException("Неверное имя");

····if (customer.getLastName() == null || "".equals(customer.getLastName()))

······throw new IllegalArgumentException("Неверная фамилия");

··}

}

К классу-слушателю применяются только простые правила. Первое правило состоит в том, что класс должен располагать конструктором public без аргументов. Второе правило заключается в том, что подписи методов обратного вызова немного отличаются от тех, что приведены в листинге 6.38. Когда вы вызываете метод обратного вызова в слушателе, этому методу необходимо иметь доступ к состоянию сущности (например, к firstName и lastName сущности Customer, которые необходимо подвергнуть валидации). Методы должны располагать параметром, имеющим тип, который совместим с типом сущности, поскольку сущность, связанная с соответствующим событием, передается в обратный вызов. Метод обратного вызова, определенный в сущности, будет иметь такую подпись без параметров:

void <МЕТОД>();

Методы обратного вызова, определенные для слушателя сущности, могут иметь подписи двух разных типов. Если метод будет использоваться в нескольких сущностях, то у него должен быть аргумент Object:

void <МЕТОД>(Object anyEntity)

Если он предназначен только для одной сущности или ее подклассов (при наследовании), то параметр может иметь тип сущности:

void <МЕТОД>(Customer customerOrSubclasses)

Для обозначения того, что эти два слушателя будут уведомляться о событиях жизненного цикла сущности Customer, вам необходимо использовать аннотацию @EntityListeners (листинг 6.41). Она может принимать в качестве параметра один слушатель сущности либо массив слушателей. Если будет определено несколько слушателей и произойдет событие жизненного цикла, то поставщик постоянства произведет итерацию по каждому слушателю в том порядке, в котором они указаны, и вызовет метод обратного вызова, передав ссылку на сущность, к которой относится соответствующее событие. Затем он вызовет методы обратного вызова в самой сущности (при наличии таковых).

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

@EntityListeners({DataValidationListener.class, AgeCalculationListener.class})

@Entity

public class Customer {

··@Id @GeneratedValue

··private Long id;

··private String firstName;

··private String lastName;

··private String email;

··private String phoneNumber;

··@Temporal(TemporalType.DATE)

··private Date dateOfBirth;

··@Transient

··private Integer age;

··@Temporal(TemporalType.TIMESTAMP)

··private Date creationDate;

··// Конструкторы, геттеры, сеттеры

}

Результат выполнения этого кода будет точно таким же, что и кода из листинга 6.38. Сущность Customer валидирует свои данные перед вставкой или обновлением с использованием метода DataValidationListener.validate() и вычислит значение своего age с помощью метода слушателя AgeCalculationListener.calculateAge().

Правила, которых должны придерживаться методы слушателя сущности, аналогичны правилам для методов обратного вызова сущности, за исключением нескольких деталей.

• Могут генерироваться только непроверяемые исключения. Это приводит к тому, что остальные слушатели и методы обратного вызова не вызываются, а транзакция подвергается откату (при наличии таковой).

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных