Снова обратимся к примеру сущности Book. На этот раз представьте, что у вас имеется две среды и вы желаете отобразить сущность Book в таблицу BOOK в среде разработки и в таблицу BOOK_XML_MAPPING в среде тестирования. Класс будет аннотирован только с помощью @Entity (листинг 5.26) и не станет включать информацию о таблице, в которую его надлежит отобразить (то есть аннотация @Table будет отсутствовать). Аннотация @Id определяет первичный ключ как генерируемый автоматически, а аннотация @Column задает длину описания равной 500 символам.
В отдельном файле 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. Встраиваемые объекты — это объекты, которые сами по себе не имеют постоянного идентификатора; они могут быть только встроены во владеющие сущности. Владеющая сущность может располагать коллекциями встраиваемых объектов, а также одним встраиваемым атрибутом. Они сохраняются как внутренняя часть владеющей сущности и совместно используют идентификатор этой сущности. Это означает, что каждый атрибут встроенного объекта будет отображаться в таблицу сущности. Это связь строгого владения (также называемая композицией), поэтому если удалить сущность, то встроенные объекты тоже окажутся удалены.
Наш сайт использует куки для сбора анонимной статистики.