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

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

Типы классов в иерархии наследования

В примерах, приводившихся ранее для объяснения стратегий отображения, были задействованы только сущности. Item, как и Book и CD, является сущностью. Однако сущностям не всегда приходится наследовать от сущностей. В иерархии классов могут быть смешаны всевозможные разные классы: сущности, а также классы, которые не являются сущностями (или временные классы), абстрактные сущности и отображенные суперклассы. Наследование от этих классов разных типов будет влиять на отображение.


Абстрактная сущность

В приведенных ранее примерах сущность Item представляла собой конкретный класс. Она была снабжена аннотацией @Entity и не имела ключевого слова abstract, однако абстрактный класс тоже может быть определен как сущность. Абстрактная сущность отличается от конкретной только тем, что нельзя непосредственно создать ее экземпляр с помощью ключевого слова new. Она обеспечивает общую структуру данных для своих листовых сущностей (Book и CD) и придерживается соответствующих стратегий отображения. Для поставщика постоянства абстрактная сущность отображается как обычная сущность. Единственное отличие заключается в пространстве Java, а не в отображении.


Класс, который не является сущностью

Классы, которые не являются сущностями, также называют временными, а это означает, что они представляют собой POJO. Сущность может выступать подклассом по отношению к классу, который не является сущностью, либо такой класс может расширять ее. Зачем вам могут понадобиться в иерархии классы, которые не являются сущностями? Объектное моделирование и наследование — это инструменты, с помощью которых совместно используются состояния и поведения. Классы, которые не являются сущностями, могут применяться для обеспечения общей структуры данных для листовых сущностей. Состояние суперкласса, не являеющегося сущностью, непостоянно, поскольку не управляется поставщиком постоянства (помните, что условием для того, чтобы класс управлялся поставщиком постоянства, является наличие аннотации @Entity).

Например, Book представляет собой сущность (листинг 5.65) и расширяет Item, который не является сущностью (у Item нет аннотаций), как показано в листинге 5.64.


Листинг 5.64. Item — простой POJO без @Entity

>public class Item {

>··protected String title;

>··protected Float price;

>··protected String description;

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

>}

Сущность Book (см. листинг 5.65) наследует от Item, поэтому Java-код может получить доступ к атрибутам title, price и description, а также к любому другому методу, который определен обычным, объектно-ориентированным, путем. Item может быть конкретным или абстрактным и не влияет на финальное отображение.


Листинг 5.65. Сущность Book расширяет POJO

>@Entity

>public class Book extends Item {

>··@Id @GeneratedValue

>··private Long id;

>··private String isbn;

>··private String publisher;

>··private Integer nbOfPage;

>··private Boolean illustrations;

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

>}

Класс Book является сущностью и наследует от Item. Однако в таблице были бы отображены только атрибуты Book. Атрибуты Item в структуре таблицы, определенной в листинге 5.66, отсутствуют. Чтобы обеспечить постоянство Book, вам потребуется создать экземпляр Book, задать значения для любых атрибутов по вашему желанию (title, price, isbn, publisher и т. д.), однако будет обеспечено постоянство только атрибутов Book (id, isbn и т. д.).


Листинг 5.66. В таблице BOOK атрибуты Item отсутствуют

>create table BOOK (

>··ID BIGINT not null,

>··ILLUSTRATIONS SMALLINT,

>··ISBN VARCHAR(255),

>··NBOFPAGE INTEGER,

>··PUBLISHER VARCHAR(255),

>··primary key (ID)

>);


Отображенный суперкласс

JPA определяет особый тип классов, называемых отображенными суперклассами, для совместного использования состояний и поведений, а также информации об отображении, которые от них наследуют сущности. Однако отображенные суперклассы не являются сущностями. Они не управляются поставщиком постоянства, у них нет какой-либо таблицы для отображения в нее, к ним нельзя выполнять запросы и они не могут состоять в связях, однако должны обеспечивать постоянные свойства для любых сущностей, которые расширяют их. Они аналогичны встраиваемым классам за исключением того, что могут быть использованы в сочетании с наследованием. Чтобы показать, что класс является отображенным суперклассом, нужно снабдить его аннотацией @MappedSuperclass.

При использовании корневого класса Item снабжается аннотацией @MappedSuperclass, а не @Entity, как показано в листинге 5.67. В данном случае определяется стратегия наследования (JOINED), а также аннотируются некоторые из его атрибутов с использованием @Column. Однако, поскольку отображенные суперклассы не отображаются в таблицах, не допускается применять аннотацию @Table.


Листинг 5.67. Item — отображенный суперкласс

>@MappedSuperclass

>@Inheritance(strategy = InheritanceType.JOINED)

>public class Item {

>··@Id @GeneratedValue

>··protected Long id;

>··@Column(length = 50, nullable = false)

>··protected String title;

>··protected Float price;

>··@Column(length = 2000)

>··protected String description;

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


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