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

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

В листинге 5.5 класс NewsId показан как встраиваемый. Он представляет собой всего лишь встроенный объект (аннотированный с использованием @Embeddable), который в данном случае включает два атрибута (title и language). У этого класса должен быть конструктор без аргументов, геттер, сеттер, а также реализации equals() и hashCode(). Это означает, что он должен придерживаться соглашений JavaBeans. У этого класса как такового нет собственного идентификатора (отсутствует аннотация @Id). Это характерно для встраиваемых классов.


Листинг 5.5. Класс первичного ключа снабжается аннотацией @Embeddable

>@Embeddable

>public class NewsId {


>··private String title;

>··private String language;


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

>}

В случае с сущностью News, показанной в листинге 5.6, затем придется встроить класс первичного ключа NewsId с применением аннотации @EmbeddedId. Благодаря такому подходу не потребуется использовать @Id. Каждая аннотация @EmbeddedId должна ссылаться на встраиваемый класс, помеченный @Embeddable.


Листинг 5.6. Вложение класса первичного ключа с применением аннотации @EmbeddedId для сущности

>@Entity

>public class News {


>··@EmbeddedId

>··private NewsId id;

>··private String content;


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

>}

В следующей главе я опишу, как находить сущности с использованием их первичного ключа. Вот первый, но мимолетный взгляд на то, как это происходит: первичный ключ — это класс с конструктором. Вам придется создать экземпляр этого класса со значениями, формирующими ваш уникальный ключ, и передать соответствующий объект менеджера сущностей (атрибут em), как показано в этом коде:

>NewsId pk = new NewsId("Richard Wright has died on September 2008", "EN")

>News news = em.find(News.class, pk);

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

Составной первичный ключ в примере NewsId, приведенном в листинге 5.7, является всего лишь POJO, которому не требуется какая-либо аннотация (в предыдущем примере в листинге 5.6 класс первичного ключа приходилось аннотировать с помощью @EmbeddedId).


Листинг 5.7. У класса первичного ключа аннотация отсутствует

>public class NewsId {


>private String title;

>··private String language;


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

>}

Затем для сущности News, показанной в листинге 5.8, придется определить первичный ключ с использованием аннотации @IdClass, и аннотировать каждый ключ посредством @Id. Для обеспечения постоянства сущности News вам потребуется задать значения для атрибутов title и language.


Листинг 5.8. Определение первичного класса с использованием аннотации @IdClass для сущности

>@Entity

>@IdClass(NewsId.class)

>public class News {


>··@Id private String title;

>··@Id private String language;

>··private String content;


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

>}

Оба варианта — @EmbeddedId и @IdClass — будут отображены в одну и ту же табличную структуру. Она определена в листинге 5.9 с использованием языка описания данных (Data Definition Language — DDL). Атрибуты сущности и первичный ключ в итоге окажутся в одной и той же таблице, а первичный ключ будет сформирован с использованием атрибутов составного класса (title и language).


Листинг 5.9. DDL-код таблицы NEWS с составным первичным ключом

>create table NEWS (

>····CONTENT VARCHAR(255),

>····TITLE VARCHAR(255) not null,

>····LANGUAGE VARCHAR(255) not null,

>····primary key (TITLE, LANGUAGE)

>);

Подход с использованием @IdClass более предрасположен к ошибкам, поскольку вам потребуется определить каждый атрибут первичного ключа как в @IdClass, так и в сущности, позаботившись об использовании одинакового имени и Java-типа. Преимущество заключается в том, что вам не придется изменять код класса первичного ключа (никаких аннотаций не потребуется). Например, вы могли бы использовать унаследованный класс, который по причинам правового характера вам не разрешено изменять, однако при этом вам предоставляется возможность его повторного использования.

Одно из видимых отличий заключается в способе, которым вы ссылаетесь на сущность при использовании JPQL. В случае с @IdClass вы сделали бы что-то вроде следующего:

>select n.title from News n

А в случае с @EmbeddedId у вас получилось бы что-то вроде показанного далее:

>select n.newsId.title from News n

Атрибуты

У сущности должен иметься первичный ключ (простой или составной), чтобы у нее был идентификатор в реляционной базе данных. Она также обладает всевозможными атрибутами, которые обуславливают ее состояние и должны быть отображены в таблицу. Это состояние способно включать почти любой Java-тип, который вам может потребоваться отобразить:

• примитивные Java-типы и классы-обертки (int, double, float и т. д.) (Integer, Double, Float и т. д.);

• массивы байтов и символов (byte[], Byte[], char[], Character[]);

• строковые, связанные с большими числами, и временные типы (java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp);


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