Изучаем Java EE 7 - [71]

Шрифт
Интервал

Эта композиция между двумя классами задействует аннотации. Для включенного класса используется аннотация @Embeddable, в то время как в отношении сущности, которая включает этот класс, используется @Embedded. Обратимся к примеру клиента, у которого имеется идентификатор, имя, адрес электронной почты, а также домашний адрес. Все соответствующие атрибуты могли бы располагаться в одной сущности Customer (листинг 5.31), однако по причинам объектного моделирования они разделены на два класса: Customer и Address. Поскольку у Address нет собственного идентификатора, и при этом он всего лишь часть состояния Customer, этот класс является хорошим кандидатом на то, чтобы стать встраиваемым объектом вместо сущности (листинг 5.30).


Листинг 5.30. Класс Address является встраиваемым объектом

>@Embeddable

>public class Address {

>··private String street1;

>··private String street2;

>··private String city;

>··private String state;

>··private String zipcode;

>··private String country;

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

>}

Как вы можете видеть в листинге 5.30, класс Address аннотирован не как сущность, а как встраиваемый объект. Аннотация @Embeddable определяет, что Address может быть встроен в иной класс-сущность (или иной встраиваемый объект). С другой стороны, для сущности Customer приходится использовать аннотацию @Embedded, чтобы определить, что Address является постоянным атрибутом, который будет сохранен как внутренняя часть и станет совместно использовать его идентификатор (см. листинг 5.31).


Листинг 5.31. Сущность Customer со встроенным Address

>@Entity

>public class Customer {

>··@Id @GeneratedValue

>··private Long id;

>··private String firstName;

>··private String lastName;

>··private String email;

>··private String phoneNumber;

>··@Embedded

>··private Address address;

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

>}

Каждый атрибут Address будет отображаться в таблицу владеющей сущности Customer. Будет только одна таблица со структурой, определенной в листинге 5.32. Как вы увидите позднее в подразделе «Переопределение атрибутов» раздела «Отображение наследования» данной главы, сущности могут переопределять атрибуты встраиваемых объектов (с использованием аннотации @AttributeOverrides).


Листинг 5.32. Структура таблицы CUSTOMER со всеми атрибутами Address

>create table CUSTOMER (

>··ID BIGINT not null,

>··LASTNAME VARCHAR(255),

>··PHONENUMBER VARCHAR(255),

>··EMAIL VARCHAR(255),

>··FIRSTNAME VARCHAR(255),

>··STREET2 VARCHAR(255),

>··STREET1 VARCHAR(255),

>··ZIPCODE VARCHAR(255),

>··STATE VARCHAR(255),

>··COUNTRY VARCHAR(255),

>··CITY VARCHAR(255),

>··primary key (ID)

>);


Примечание

В предшествующих разделах я показывал вам, как отображать коллекции и отображения базовых типов данных. В JPA 2.1 то же самое возможно с помощью встраиваемых объектов. Вы можете отображать коллекции встраиваемых объектов, а также отображения таких объектов (встраиваемый объект может быть либо ключом, либо значением отображения).


Тип доступа встраиваемого класса. Тип доступа встраиваемого класса обуславливается типом доступа класса-сущности, в котором он располагается. Если сущность явным образом использует такой тип доступа, как доступ к свойствам, то встраиваемый объект будет неявно использовать аналогичный тип доступа. Другой тип доступа для встраиваемого класса можно указать с помощью аннотации @Access.

Сущности Customer (листинг 5.33) и Address (листинг 5.34) задействуют разные типы доступа.


Листинг 5.33. Сущность Customer с таким типом доступа, как доступ к полям

>@Entity

>@Access(AccessType.FIELD)

>public class Customer {

>··@Id @GeneratedValue

>··private Long id;

>··@Column(name = "first_name", nullable = false, length = 50)

>··private String firstName;

>··@Column(name = "last_name", nullable = false, length = 50)

>··private String lastName;

>··private String email;

>··@Column(name = "phone_number", length = 15)

>··private String phoneNumber;

>··@Embedded

>··private Address address;

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

>}


Листинг 5.34. Встраиваемый объект с таким типом доступа, как доступ к свойствам

>@Embeddable

>@Access(AccessType.PROPERTY)

>public class Address {

>··private String street1;

>··private String street2;

>··private String city;

>··private String state;

>··private String zipcode;

>··private String country;

>··// Конструкторы

>··@Column(nullable = false)

>··public String getStreet1() {

>····return street1;

>··}

>··public void setStreet1(String street1) {

>····this.street1 = street1;

>··}

>··public String getStreet2() {

>····return street2;

>··}

>··public void setStreet2(String street2) {

>····this.street2 = street2;

>··}

>··@Column(nullable = false, length = 50)

>··public String getCity() {

>····return city;

>··}

>··public void setCity(String city) {

>····this.city = city;

>··}

>··@Column(length = 3)

>··public String getState() {

>····return state;

>··}

>··public void setState(String state) {

>····this.state = state;

>··}

>··@Column(name = "zip_code", length = 10)

>··public String getZipcode() {

>····return zipcode;

>··}

>··public void setZipcode(String zipcode) {

>····this.zipcode = zipcode;

>··}

>··public String getCountry() {

>····return country;

>··}

>··public void setCountry(String country) {

>····this.country = country;

>··}

>}

Настоятельно рекомендуется явным образом задавать тип доступа для встраиваемых объектов, чтобы избежать ошибок отображения, когда один встраиваемый объект окажется встроенным во множественные сущности. К примеру, расширим нашу модель, добавив сущность Order, как показано на рис. 5.4. Address теперь будет встроен в Customer и Order.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.