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

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


Рис. 5.4. Address встроен в Customer и Order


Для каждой сущности определяется отличающийся тип доступа: Customer использует доступ к полям, а Order — доступ к свойствам. Поскольку тип доступа встраиваемого объекта обуславливается типом доступа класса-сущности, в котором он объявлен, Address будет отображен двумя разными путями, что может привести к проблемам отображения. Чтобы этого не случилось, тип доступа Address должен быть задан явным образом.


Примечание

Типы явного доступа также очень полезны, когда речь идет о наследовании. По умолчанию листовые сущности наследуют тип доступа от своей корневой сущности. В иерархии сущностей доступ к каждой из них возможен по-разному из других классов в иерархии. Включение аннотации @Access фактически приведет к тому, что режим доступа по умолчанию для иерархии будет локально переопределен.

Отображение связей

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

Прежде всего, у ассоциации есть направление. Она может быть однонаправленной (один объект может осуществлять навигацию по направлению к другому объекту) и двунаправленной (один объект может осуществлять навигацию по направлению к другому и наоборот). В Java для навигации по объектам используется точечный (.) синтаксис. Например, если написать customer.getAddress(). getCountry(), то будет осуществляться навигация от объекта Customer к объекту Address, а затем — к объекту Country.

В унифицированном языке моделирования (Unified Modeling Language — UML) для представления однонаправленной ассоциации между двумя классами используется стрелка, указывающая направление. На рис. 5.5 Class1 (источник) может осуществлять навигацию по направлению к Class2 (цель), но не наоборот.


Рис. 5.5. Однонаправленная ассоциация между двумя классами


Для индикации двунаправленной ассоциации стрелки не используются. Как показано на рис. 5.6, Class1 может осуществлять навигацию по направлению к Class2 и наоборот. В Java это представляется как наличие у Class1 атрибута типа Class2 и наличие у Class2 атрибута типа Class1.


Рис. 5.6. Двунаправленная ассоциация между двумя классами


Для ассоциации также характерна множественность (или кардинальность). На каждом из концов ассоциации можно указать, сколько ссылающихся объектов вовлечено в нее. На UML-диаграмме, приведенной на рис. 5.7, показано, что Class1 ссылается на нуль или более экземпляров Class2.


Рис. 5.7. Множественность ассоциаций классов


В UML кардинальность — это диапазон между минимальным и максимальным числами. Таким образом, 0..1 означает, что у вас будет минимум нуль объектов и максимум один объект; 1 означает, что у вас один и только один экземпляр; 1..* означает, что у вас может быть один или много экземпляров, а 3..6 означает, что у вас может быть от трех до шести объектов. В Java ассоциация, представляющая более одного объекта, задействует коллекции типа java.util.Collection, java.util.Set, java.util.List или даже java.util.Map.

В случае со связью имеет место владение (то есть владелец связи). При однонаправленной связи предполагается владение: нет сомнения, что на рис. 5.5 владельцем является Class1, однако при двунаправленной связи, как показано на рис. 5.6, владельца нужно указывать явным образом. В таком случае вы показываете владельца, который определяет физическое отображение и противоположную сторону (не владеющую сторону).

В следующих разделах вы увидите, как отображать коллекции объектов с использованием аннотаций JPA.

Связи в реляционных базах данных

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

В качестве примера предположим, что у клиента имеется один домашний адрес. В листингах 5.33 и 5.34 мы моделировали эту связь как встраиваемый объект, однако теперь превратим ее в связь «один к одному». При использовании Java у вас имелся бы класс Customer с атрибутом Address. В реляционном мире у вас могла бы быть таблица CUSTOMER, указывающая на ADDRESS с помощью столбца внешнего ключа (или столбца соединения), как показано на рис. 5.8.


Рис. 5.8. Связь с использованием столбца соединения


Есть и второй способ моделирования — с применением таблицы соединения. В таблице CUSTOMER, показанной на рис. 5.9, больше нет внешнего ключа ADDRESS. Для размещения информации о связи с сохранением внешних ключей была создана промежуточная таблица.


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