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

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

В качестве первого примера начнем с простой сущности, которая только может быть у нас. В модели постоянства JPA сущность — это простой Java-объект в старом стиле (Plain Old Java Object — POJO). Это означает, что объявление сущности, создание ее экземпляра и использование осуществляются точно так же, как и в случае с любым другим Java-классом. У сущности имеются атрибуты (ее состояние), которыми можно манипулировать с помощью геттеров и сеттеров. Пример простой сущности приведен в листинге 4.1.


Листинг 4.1. Простой пример сущности Book

>@Entity

>public class Book {

>··@Id @GeneratedValue

>··private Long id;

>··private String title;

>··private Float price;

>··private String description;

>··private String isbn;

>··private Integer nbOfPage;

>··private Boolean illustrations;

>··public Book() {

>}

>// Геттеры, сеттеры

>}

В примере в листинге 4.1 представлена сущность Book, из которой я для ясности убрал геттеры и сеттеры. Как вы можете видеть, за исключением некоторых аннотаций, эта сущность выглядит точно так же, как любой другой Java-класс: у нее есть атрибуты (id, title, price и т. д.) разных типов (Long, String, Float, Integer и Boolean), конструктор по умолчанию, при этом имеются геттеры и сеттеры для каждого атрибута. Как все это отображается в таблицу? Ответ можно получить благодаря аннотациям.

Анатомия сущности

Чтобы класс был сущностью, его нужно снабдить аннотацией @javax.persistence.Entity, которая позволит поставщику постоянства признать его постоянным классом, а не простым POJO. Кроме того, аннотация @javax.persistence.Id будет определять уникальный идентификатор этого объекта. Поскольку JPA используется для отображения объектов в реляционные таблицы, объектам необходим идентификатор, который будет отображен в первичный ключ. Остальные атрибуты в листинге 4.1 (title, price, description и т. д.) не снабжены аннотациями, поэтому они будут сделаны постоянными путем применения отображения по умолчанию.

Этот пример кода включает атрибуты, однако, как вы увидите позднее, сущность также может располагать бизнес-методами. Обратите внимание, что эта сущность Book является Java-классом, который не реализует никакого интерфейса и не расширяет какого-либо класса. Фактически, чтобы быть сущностью, класс должен придерживаться таких правил.

• Класс-сущность должен быть снабжен аннотацией @javax.persistence.Entity (или обозначен в XML-дескрипторе как сущность).

• Для обозначения простого первичного ключа должна быть использована аннотация @javax.persistence.Id.

• Класс-сущность должен располагать конструктором без аргументов, который должен быть public или protected. У класса-сущности также могут иметься другие конструкторы.

• Класс-сущность должен быть классом верхнего уровня. Перечисление или интерфейс не могут быть обозначены как сущность.

• Класс-сущность не должен быть final. Ни один из методов или постоянные переменные экземпляра класса-сущности тоже не могут быть final.

• Если экземпляр сущности надлежит передать с использованием значения как обособленный объект (например, с помощью удаленного интерфейса), то класс-сущность должен реализовывать интерфейс Serializable.


Примечание

В предыдущих версиях Java EE постоянная компонентная модель называлась Entity Bean (Компонент-сущность EJB) или Entity Bean CMP (Container-Managed Persistence) (Сохраняемость компонентов-сущностей EJB, управляемая контейнером) и была связана с Enterprise JavaBeans. Эта модель постоянства использовалась, начиная с J2EE 1.3 и до появления версии 1.4, однако была тяжеловесной и в конце концов оказалась заменена JPA с выходом версии Java EE 5. В JPA вместо словосочетания «компонент-сущность EJB» используется термин «сущность».

Объектно-реляционное отображение

Принцип объектно-реляционного отображения заключается в возложении на внешние инструменты или фреймворки (в нашем случае JPA) задачи по обеспечению соответствия между объектами и таблицами. Тогда мир классов, объектов и атрибутов можно будет отобразить в реляционные базы данных, состоящие из таблиц, которые содержат строки и столбцы. Отображение обеспечивает объектно-ориентированное представление для разработчиков, которые смогут прозрачно использовать сущности вместо таблиц. Как именно JPA отображает объекты в базе данных? Ответ: с помощью метаданных.

С каждой сущностью ассоциированы метаданные, которые описывают отображение. Они позволяют поставщику постоянства распознать сущность и интерпретировать отображение. Метаданные могут быть записаны в двух разных форматах.

• Аннотации — код сущности непосредственно снабжается всевозможными аннотациями, описанными в пакете javax.persistence.

• XML-дескрипторы — вместо аннотаций (или в дополнение к ним) вы можете использовать XML-дескрипторы. Отображение определяется во внешнем XML-файле, который будет развернут вместе с сущностями. Это может оказаться очень полезным, если, к примеру, конфигурация базы данных будет изменяться в зависимости от среды.

В случае с сущностью Book (показанной в листинге 4.1) используются аннотации JPA, чтобы поставщик постоянства смог синхронизировать данные между атрибутами сущности Book и столбцами таблицы BOOK. Следовательно, если атрибут isbn окажется модифицирован приложением, то будет синхронизирован столбец ISBN (при управлении сущностью, задании контекста транзакций и т. д.).


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.