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

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

Снова обратимся к примеру сущности Book. На этот раз представьте, что у вас имеется две среды и вы желаете отобразить сущность Book в таблицу BOOK в среде разработки и в таблицу BOOK_XML_MAPPING в среде тестирования. Класс будет аннотирован только с помощью @Entity (листинг 5.26) и не станет включать информацию о таблице, в которую его надлежит отобразить (то есть аннотация @Table будет отсутствовать). Аннотация @Id определяет первичный ключ как генерируемый автоматически, а аннотация @Column задает длину описания равной 500 символам.


Листинг 5.26. Сущность Book лишь с несколькими аннотациями

>@Entity

>public class Book {

>··@Id @GeneratedValue

>··private Long id;

>··private String title;

>··private Float price;

>··@Column(length = 500)

>··private String description;

>··private String isbn;

>··private Integer nbOfPage;

>··private Boolean illustrations;

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

>}

В отдельном файле book_mapping.xml (листинг 5.27), придерживаясь заданной XML-схемы, вы можете изменить отображение для любых данных сущности. Тег

позволяет вам изменить имя таблицы, в которую будет отображаться сущность (BOOK_XML_MAPPING вместо BOOK по умолчанию). В теге вы можете настроить атрибуты, указав не только их имена и длину, но и их связи с другими сущностями. Например, вы можете изменить отображение для столбца title и количество страниц (nbOfPage).


Листинг 5.27. Отображение файла META-INF/book_mapping.xml

>

>

>·················xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

>············xsi: schemaLocation="http://java.sun.com/xml/ns/persistence/orm 

>·················http://java.sun.com/xml/ns/persistence/orm_2_1.xsd"

>·················version="2.1">

>··

>····

>····

>······

>········

>······

>······

>········

>······

>······

>········

>······

>····

>··

>

Всегда следует помнить о том, что XML имеет преимущественное значение перед аннотациями. Хотя атрибут description и аннотирован посредством @Column(length = 500), используется та длина столбца, которая указана в файле book_mapping.xml (см. листинг 5.27). Она равна 2000. Это может привести в замешательство, если вы взглянете на соответствующий код и увидите значение 500, а затем посмотрите на DDL-код и увидите значение 2000. Никогда не забывайте проверять XML-дескриптор развертывания.

Результатом слияния XML-метаданных и метаданных аннотаций является то, что сущность Book будет отображена в структуру таблицы BOOK_XML_MAPPING, определенную в листинге 5.28. Если вы решите полностью проигнорировать аннотации и определить свое отображение с использованием только XML, то сможете добавить тег в файл book_mapping.xml (в данном случае все аннотации будут игнорироваться, даже если XML не будет содержать переопределение).


Листинг 5.28. Структура таблицы BOOK_XML_MAPPING

>create table BOOK_XML_MAPPING (

>··ID BIGINT not null,

>··BOOK_TITLE VARCHAR(255) not null,

>··DESCRIPTION VARCHAR(2000),

>··NB_OF_PAGE INTEGER not null,

>··PRICE DOUBLE(52, 0),

>··ISBN VARCHAR(255),

>··ILLUSTRATIONS SMALLINT,

>··primary key (ID)

>);

Чтобы заставить все это работать, не хватает лишь одной порции информации. Вам нужно указать ссылку на файл book_mapping.xml в своем файле persistence.xml, для чего потребуется прибегнуть к тегу . Названный файл определяет контекст постоянства сущности и базу данных, в которую она должна быть отображена. Это самая важная порция информации, которая необходима поставщику постоянства для ссылки на внешний XML-файл отображения. Произведите развертывание сущности Book с обоими XML-файлами в каталоге META-INF, и все будет готово (листинг 5.29).


Листинг 5.29. Файл persistence.xml со ссылкой на внешний файл отображения

>

>

>·············xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

>·············xsi: schemaLocation="http://java.sun.com/xml/ns/persistence 

>·············http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"

>·············version="2.1">

>··

>····org.eclipse.persistence.jpa.PersistenceProvider

>······org.agoncal.book.javaee7.chapter05.Book

>······META-INF/book_mapping.xml

>······

>········

>······

>··

>

Встраиваемые объекты

В приводившемся ранее в этой главе подразделе «Составные первичные ключи» вы видели, как класс может быть встроен и использован в качестве первичного ключа с применением аннотации @EmbeddedId. Встраиваемые объекты — это объекты, которые сами по себе не имеют постоянного идентификатора; они могут быть только встроены во владеющие сущности. Владеющая сущность может располагать коллекциями встраиваемых объектов, а также одним встраиваемым атрибутом. Они сохраняются как внутренняя часть владеющей сущности и совместно используют идентификатор этой сущности. Это означает, что каждый атрибут встроенного объекта будет отображаться в таблицу сущности. Это связь строгого владения (также называемая композицией), поэтому если удалить сущность, то встроенные объекты тоже окажутся удалены.


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