Трудно сказать, я не знаю, что вы хотите представить на объектном уровне: это взаимно-однозначная ассоциация внешнего ключа?ассоциация много-к-одному?является ли ассоциация двунаправленной?Использование ORM означает думать объекты больше, чем таблицы, и это обычно помогает обеспечить объектную модель.
7.1.2 Ассоциации внешнего ключа один к одному
Вместо совместного использования первичного ключа, две строкиможет иметь отношения с внешним ключом.В одной таблице есть столбец внешнего ключа, который ссылается на первичный ключ связанной таблицы.(Источником и целью этого ограничения внешнего ключа может быть даже одна и та же таблица: это называется самосвязанной взаимосвязью.)
Давайте изменим отображение с пользователя на адрес.Вместо общего первичного ключа вы теперь добавляете столбец SHIPPING_ADDRESS_ID в таблицу USERS:
<class name="User" table="USERS">
<many-to-one name="shippingAddress"
class="Address"
column="SHIPPING_ADDRESS_ID"
cascade="save-update"
unique="true"/>
</class>
Элементом отображения в XML для этой ассоциации является <many-to-one>
- не <one-to-one>
, как вы могли ожидать,Причина проста: вам все равно, что находится на целевой стороне ассоциации, поэтому вы можете рассматривать ее как to-one ассоциацию без множества частей.Все, что вам нужно, это выразить «Эта сущность имеет свойство, которое является ссылкой на экземпляр другой сущности» и использовать поле внешнего ключа для представления этой связи.Схема базы данных для этого сопоставления показана на рисунке 7.3.
Рисунок 7.3. Сопоставление внешних ключей один к одному между USERS
и ADDRESS
Дополнительное ограничение навязывает это соотношение как реальное один к одному.Делая столбец SHIPPING_ADDRESS_ID
уникальным, вы объявляете, что на определенный адрес может ссылаться не более одного пользователя как адрес доставки.Это не так сильно, как гарантия от ассоциации общего первичного ключа, которая позволяет конкретному адресу ссылаться максимум одним пользователем, точка.С несколькими столбцами внешнего ключа (допустим, у вас также есть уникальные HOME_ADDRESS_ID
и BILLING_ADDRESS_ID
), вы можете ссылаться на одну и ту же строку назначения адреса несколько раз.Но в любом случае два пользователя не могут использовать один и тот же адрес для одной цели.
Давайте сделаем связь между пользователем и адресом двунаправленной.
Обратная ссылка на свойство
Последнее сопоставление внешнего ключа было сопоставлено с пользователем на адрес с <many-to-one>
и уникальным ограничением, чтобы гарантировать желаемую множественность.Какой элемент сопоставления можно добавить на стороне адреса, чтобы сделать эту ассоциацию двунаправленной, чтобы в модели домена Java был возможен доступ от адреса к пользователю?
В XML вы создаете сопоставление <one-to-one>
со свойствоматрибут ссылки:
<one-to-one name="user"
class="User"
property-ref="shippingAddress"/>
Вы говорите Hibernate, что свойство пользователя класса Address является обратным свойству на другой стороне ассоциации.Теперь вы можете позвонить anAddress.getUser()
, чтобы получить доступ к пользователю, адрес доставки которого вы указали.Нет дополнительного столбца или ограничения внешнего ключа;Hibernate управляет этим указателем для вас.
Если то, что у вас есть, на самом деле является реальной ассоциацией «многие-к-одному», адаптировать вышеуказанное решение должно быть довольно легко.