Изучаем Java EE 7 - [80]
Рис. 5.23. Фрагмент таблицы ITEM, наполненной данными
Столбец дискриминатора по умолчанию имеет имя DTYPE, тип String (отображаемый в VARCHAR) и содержит имя сущности. Если используемые по умолчанию значения окажутся неподходящими, то аннотация @DiscriminatorColumn позволит вам изменить имя и тип данных. По умолчанию значением этого столбца является имя сущности, на которую он ссылается, однако сущность может переопределить это значение благодаря аннотации @DiscriminatorValue.
В листинге 5.57 столбец дискриминатора переименовывается в DISC (вместо DTYPE), а также изменяется его тип данных с String на Char. Тогда значение дискриминатора каждой из сущностей должно измениться соответственно с Item на I, с Book на B (листинг 5.58) и с CD на C (листинг 5.59).
>@Entity
>@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
>@DiscriminatorColumn (name="disc",
>······················discriminatorType = DiscriminatorType.CHAR)
>@DiscriminatorValue("I")
>public class Item {
>··@Id @GeneratedValue
>··protected Long id;
>··protected String title;
>··protected Float price;
>··protected String description;
>··// Конструкторы, геттеры, сеттеры
>}
>@DiscriminatorValue("B")
>public class Book extends Item {
>··private String isbn;
>··private String publisher;
>··private Integer nbOfPage;
>··private Boolean illustrations;
>··// Конструкторы, геттеры, сеттеры
>}
>@DiscriminatorValue("C")
>public class CD extends Item {
>··private String musicCompany;
>··private Integer numberOfCDs;
>··private Float totalDuration;
>··private String genre;
>··// Конструкторы, геттеры, сеттеры
>}
Корневая сущность Item один раз определяет столбец дискриминатора для иерархии сущностей с использованием @DiscriminatorColumn. Затем она изменяет свое значение по умолчанию на I благодаря @DiscriminatorValue. Дочерним сущностям требуется переопределить только собственное значение дискриминатора.
Результат показан на рис. 5.24. Столбец дискриминатора и его значения отличаются от тех, что были приведены ранее на рис. 5.23.
Рис. 5.24. Таблица ITEM, включающая другое имя и значения дискриминатора
Стратегия «одна таблица на класс» является самой легкой для понимания и хорошо работает, когда иерархия относительно проста и стабильна. Однако у нее имеются кое-какие недостатки: добавление новых сущностей в иерархию или атрибутов в уже существующие сущности влечет добавление новых столбцов в таблицу, миграцию данных и изменение индексов. Эта стратегия также требует, чтобы столбцы дочерних сущностей допускали значение null. Если столбец сущности Book, содержащий ISBN-номер, не окажется таковым, то вы больше не сможете вставлять данные, которые относятся к CD-альбомам, поскольку для сущности CD отсутствует значение такого столбца.
При использовании стратегии «соединенный подкласс» каждая сущность в иерархии отображается в свою таблицу. Корневая сущность отображается в таблицу, которая определяет первичный ключ, подлежащий использованию всеми таблицами в иерархии, а также столбец дискриминатора. Каждый подкласс представляется с помощью отдельной таблицы, содержащей его атрибуты (не унаследованные от корневого класса) и первичный ключ, который ссылается на первичный ключ корневой таблицы. Таблицы, не являющиеся корневыми, не содержат столбец дискриминатора.
Вы можете реализовать стратегию «соединенный подкласс», снабдив корневую сущность аннотацией @Inheritance, как показано в листинге 5.60 (код CD и Book останется таким же, как и раньше).
>@Entity
>@Inheritance(strategy = InheritanceType.JOINED)
>public class Item {
>··@Id @GeneratedValue
>··protected Long id;
>··protected String title;
>··protected Float price;
>··protected String description;
>··// Конструкторы, геттеры, сеттеры
>}
С точки зрения разработчика, стратегия «соединенный подкласс» естественна, поскольку состояния всех сущностей, абстрактных или конкретных, будут отображаться в разные таблицы. На рис. 5.25 показано, как будут отображены сущности Item, Book и CD.
Рис. 5.25. Отображение наследования с применением стратегии «соединенный подкласс»
Вы по-прежнему сможете использовать аннотации @DiscriminatorColumn и @DiscriminatorValue в случае с корневой сущностью для настройки столбца дискриминатора и изменения значений (столбец DTYPE располагается в таблице ITEM).
Стратегия «соединенный подкласс» интуитивно понятна и близка к тому, что вы знаете, исходя из механизма объектного наследования. Однако выполнение запросов может влиять на производительность. В названии этой стратегии присутствует слово «соединенный», так как для повторной сборки экземпляра подкласса таблицу подкласса необходимо соединить с таблицей корневого класса. Чем глубже иерархия, тем больше соединений потребуется для сборки листовой сущности. Эта стратегия хорошо поддерживает полиморфные связи, однако требует, чтобы при создании экземпляров подклассов сущностей была проведена одна или несколько операций соединения. Это может привести к низкой производительности в случае с обширными иерархиями классов. Аналогичным образом запросы, которые охватывают всю иерархию классов, требуют проведения операций соединения между таблицами подклассов, приводящих к снижению производительности.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.