Изучаем Java EE 7 - [71]
Эта композиция между двумя классами задействует аннотации. Для включенного класса используется аннотация @Embeddable, в то время как в отношении сущности, которая включает этот класс, используется @Embedded. Обратимся к примеру клиента, у которого имеется идентификатор, имя, адрес электронной почты, а также домашний адрес. Все соответствующие атрибуты могли бы располагаться в одной сущности Customer (листинг 5.31), однако по причинам объектного моделирования они разделены на два класса: Customer и Address. Поскольку у Address нет собственного идентификатора, и при этом он всего лишь часть состояния Customer, этот класс является хорошим кандидатом на то, чтобы стать встраиваемым объектом вместо сущности (листинг 5.30).
>@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).
>@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).
>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) задействуют разные типы доступа.
>@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;
>··// Конструкторы, геттеры, сеттеры
>}
>@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.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.