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

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

• перечислимые типы, а также определяемые пользователем типы, которые реализуют интерфейс Serializable;

• коллекции базовых и встраиваемых типов.

Разумеется, у сущности также могут иметься атрибуты сущности, коллекции сущностей или встраиваемые классы. Это требует рассказа о связях между сущностями (которые будут рассмотрены в разделе «Отображение связей»).

Как вы уже видели ранее, при конфигурации в порядке исключения атрибуты отображаются с использованием правил отображения по умолчанию. Однако иногда возникает необходимость настроить детали этого отображения. Именно здесь в дело вступают аннотации JPA (или их XML-эквиваленты).


@Basic

Опциональная аннотация @javax.persistence.Basic (листинг 5.10) является отображением в столбец базы данных, относящимся к самому простому типу, поскольку она переопределяет базовое постоянство.


Листинг 5.10. Элементы аннотации @Basic

>@Target({METHOD, FIELD}) @Retention(RUNTIME)

>public @interface Basic {

>··FetchType fetch() default EAGER;

>··boolean optional() default true;

>}

У этой аннотации есть два параметра: optional и fetch. Элемент optional подсказывает вам, может ли null быть значением атрибута. Однако он игнорируется для примитивных типов. Элемент fetch может принимать два значения: LAZY или EAGER. Он намекает на то, что во время выполнения поставщика постоянства выборка данных должна быть отложенной (только когда приложение запрашивает соответствующее свойство) или быстрой (когда сущность изначально загружается поставщиком).

Возьмем, к примеру, сущность Track, показанную в листинге 5.11. В CD-альбом входит несколько треков, имеющих название, описание и WAV-файл определенной длительности, который вы можете прослушать. WAV-файл представляет собой BLOB-объект, который может иметь объем несколько мегабайт. Вам не нужно, чтобы при доступе к сущности Track WAV-файл тут же быстро загружался; вы можете снабдить атрибут аннотацией @Basic(fetch = FetchType.LAZY), и извлечение информации из базы данных будет отложенным (например, только при доступе к атрибуту wav с использованием его геттера).


Листинг 5.11. Сущность Entity с отложенной загрузкой для атрибута wav

>@Entity

>public class Track {


>··@Id @GeneratedValue(strategy = GenerationType.AUTO)

>··private Long id;

>··private String title;

>··private Float duration;

>··@Basic(fetch = FetchType.LAZY)

>··@Lob

>··private byte[] wav;

>··private String description;


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

>}

Обратите внимание, что атрибут wav типа byte[] также аннотирован с помощью @Lob для сохранения значения как большого объекта (Large Object — LOB). Столбцы базы данных, в которых могут храниться большие объекты такого типа, требуют специальных JDBC-вызовов для доступа к ним из Java-кода. Для информирования поставщика в случае с базовым отображением должна быть добавлена опциональная аннотация @Lob.


@Column

Аннотация @javax.persistence.Column, показанная в листинге 5.12, определяет свойства столбца. Вы можете изменить имя столбца (которое по умолчанию отображается в совпадающее с ним имя атрибута), а также указать размер и разрешить (или запретить) столбцу иметь значение null, быть уникальным или позволить его значению быть обновляемым или вставляемым. В листинге 5.12 приведен API-интерфейс аннотации @Column с элементами и их значениями по умолчанию.


Листинг 5.12. Элементы аннотации @Column

>@Target({METHOD, FIELD}) @Retention(RUNTIME)

>public @interface Column {

>··String name() default "";

>··boolean unique() default false;

>··boolean nullable() default true;

>··boolean insertable() default true;

>··boolean updatable() default true;

>··String columnDefinition() default "";

>··String table() default "";

>··int length() default 255;

>··int precision() default 0; // десятичная точность

>··int scale() default 0;·····// десятичная система счисления

>}

Для переопределения отображения по умолчанию оригинальной сущности Book (см. листинг 5.1) вы можете использовать аннотацию @Column разными способами (листинг 5.13). Например, вы можете изменить имя столбца title и nbOfPage либо длину description и не разрешить значения null. Следует отметить, что допустимы не все комбинации атрибутов для типов данных (например, length применим только к столбцу со строковым значением, а scale и precision — только к десятичному столбцу).


Листинг 5.13. Настройка отображения сущности Book

>@Entity

>public class Book {

>··@Id @GeneratedValue(strategy = GenerationType.AUTO)

>··private Long id;

>··@Column(name = "book_title", nullable = false, updatable = false)

>··private String title;

>··private Float price;

>··@Column(length = 2000)

>··private String description;

>··private String isbn;

>··@Column(name = "nb_of_page", nullable = false)

>··private Integer nbOfPage;

>··private Boolean illustrations;

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

>}

Сущность Book из листинга 5.13 будет отображена в определение таблицы, показанное в листинге 5.14.


Листинг 5.14. Определение таблицы BOOK

>create table BOOK (

>··ID BIGINT not null,

>··BOOK_TITLE VARCHAR(255) not null,

>··PRICE DOUBLE(52, 0),

>··DESCRIPTION VARCHAR(2000),

>··ISBN VARCHAR(255),

>··NB_OF_PAGE INTEGER not null,

>··ILLUSTRATIONS SMALLINT,


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