Hibernate, как смоделировать эти отношения - PullRequest
1 голос
/ 28 июля 2010

У меня есть таблицы ниже.

create table logical_id_seq (
    logical_id int auto_increment,
    primary key(logical_id)
);

create table mytable (
    physical_id int auto_increment,
    logical_id int not null references parent(logical_id),
    data varchar(20),
    primary key(physical_id)
);

Вторая таблица использует автоматически сгенерированное значение первой таблицы в качестве значения.Я не уверен, как смоделировать это в спящем режиме.

Я читаю http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-onetoone,, но, похоже, я не понимаю.

1 Ответ

2 голосов
/ 28 июля 2010

Трудно сказать, я не знаю, что вы хотите представить на объектном уровне: это взаимно-однозначная ассоциация внешнего ключа?ассоциация много-к-одному?является ли ассоциация двунаправленной?Использование ORM означает думать объекты больше, чем таблицы, и это обычно помогает обеспечить объектную модель.

Я предполагаю, что это однозначная ассоциация внешнего ключа.Вот что Java Persistence с Hibernate рекомендует:

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.

alt text

Рисунок 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 управляет этим указателем для вас.

Если то, что у вас есть, на самом деле является реальной ассоциацией «многие-к-одному», адаптировать вышеуказанное решение должно быть довольно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...