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

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

Таблицы

Согласно правилам отображения с использованием подхода «конфигурация в порядке исключения» имена сущности и таблицы должны совпадать (сущность Book будет отображаться в таблице BOOK, сущность AncientBook — в таблице ANCIENTBOOK и т. д.). Это, возможно, будет устраивать вас в большинстве ситуаций, однако вам может потребоваться отобразить свои данные в другой таблице или даже отобразить одну сущность в нескольких таблицах.


@Table

Аннотация @javax.persistence.Table дает возможность изменять значения по умолчанию, связанные с определенной таблицей. Например, вы можете указать имя таблицы, в которой будут храниться данные, каталог и схему базы данных. Вы также можете определить уникальные ограничения для таблицы с помощью аннотации @UniqueConstraint в сочетании с @Table. Если пренебречь аннотацией @Table, то имя таблицы будет соответствовать имени сущности. Если вы захотите изменить имя с BOOK на T_BOOK, то поступите так, как показано в листинге 5.1.


Листинг 5.1. Сущность Book, отображаемая в таблице T_BOOK

>@Entity

>@Table(name = "t_book")

>public class Book {


>@Id

>··private Long id;

>··private String title;

>··private Float price;

>··private String description;

>··private String isbn;

>··private Integer nbOfPage;

>··private Boolean illustrations;


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

>}


Примечание

Я включил в аннотацию @Table имя таблицы в нижнем регистре (t_book). По умолчанию большинство баз данных будут отображать имя сущности в имя таблицы в верхнем регистре (именно так дело обстоит в случае с Derby), если только вы не сконфигурируете их на соблюдение регистра.


@SecondaryTable

До сих пор я исходил из того, что сущность будет отображаться в одну таблицу, также известную как первичная таблица. Но если у вас есть уже существующая модель данных, необходимо разбросать данные по нескольким таблицам, или вторичным таблицам. Для этого вам потребуется прибегнуть к аннотации @SecondaryTable, чтобы ассоциировать вторичную таблицу с сущностью, или @SecondaryTables (с буквой s на конце) в случае с несколькими вторичными таблицами. Вы можете распределить данные требуемой сущности по столбцам как первичной таблицы, так и вторичных таблиц, просто определив вторичные таблицы с использованием аннотаций, а затем указав для каждого атрибута то, к какой таблице он относится (с помощью аннотации @Column, более подробное описание которой я приведу в подразделе «@Column»). В листинге 5.2 показано отображение атрибутов сущности Address в одну первичную таблицу и две вторичные таблицы.


Листинг 5.2. Атрибуты сущности Address, отображаемые в три разные таблицы

>@Entity

>@SecondaryTables({

>··@SecondaryTable(name = "city"),

>>··@SecondaryTable(name = "country")

>})

>public class Address {


>··@Id

>··private Long id;

>··private String street1;

>··private String street2;

>··@Column(table = "city")

>··private String city;

>··@Column(table = "city")

>··private String state;

>··@Column(table = "city")

>··private String zipcode;

>··@Column(table = "country")

>··private String country;


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

>}

По умолчанию атрибуты сущности Address будут отображаться в первичную таблицу (которая по умолчанию имеет имя сущности, поэтому называется ADDRESS). Аннотация @SecondaryTables проинформирует вас о том, что в данном случае есть две вторичные таблицы: CITY и COUNTRY. Затем вам потребуется указать, какой атрибут в какой таблице будет располагаться (с использованием аннотации @Column(table="city") или @Column(table="country")). На рис. 5.1 показана структура таблиц, в которых будет отображаться сущность Address. Каждая таблица содержит разные атрибуты, однако у всех имеется один и тот же первичный ключ (для соединения таблиц). Опять-таки не забывайте, что Derby преобразует имена таблиц в нижнем регистре (city) в имена таблиц в верхнем регистре (CITY).


Рис. 5.1. Сущность Address отображается в трех таблицах


Как вы, вероятно, уже поняли, для одной и той же сущности может быть несколько аннотаций. Если вы захотите переименовать первичную таблицу, то можете добавить аннотацию @Table, как показано в листинге 5.3.


Листинг 5.3. Первичная таблица переименовывается в T_ADDRESS

>@Entity

>@Table(name = "t_address")

>@SecondaryTables({

>··@SecondaryTable(name = "t_city"),

>··@SecondaryTable(name = "t_country")

>})

>public class Address {


>··// Атрибуты, конструктор, геттеры, сеттеры

>}


Примечание

При использовании вторичных таблиц вы должны принимать во внимание производительность. Каждый раз, когда вы получаете доступ к сущности, поставщик постоянства обращается к нескольким таблицам, которые ему приходится соединять. С другой стороны, вторичные таблицы могут оказаться кстати, когда у вас имеются «затратные» атрибуты вроде больших двоичных объектов (Binary Large Object — BLOB), которые вы хотите изолировать в другой таблице.

Первичные ключи

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


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