Будьте в спящем режиме, как смоделировать эти отношения

Я имею ниже таблиц.

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
задан Boolean 28 July 2010 в 01:12
поделиться

1 ответ

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

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

7.1.2 Однозначные ассоциации внешнего ключа

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

Давайте изменим отображение пользователя по адресу. Вместо общего первичный ключ, теперь вы добавляете Столбец SHIPPING_ADDRESS_ID в столбце Таблица USERS:

 
 

Элемент сопоставления в XML для этого ассоциация - не , как вы могли бы ожидал. Причина проста: вы не волнует, что на целевой стороне ассоциации, так что вы можете лечить это похоже на ассоциацию к одному без многие части. Все, что ты хочешь, это express «У этого объекта есть собственность это ссылка на экземпляр другой объект »и используйте внешний ключ поле для представления этой связи. Схема базы данных для этого сопоставления показано на рисунке 7.3.

alt text

Рис. 7.3 Индивидуальные иностранные ключевая связь между ПОЛЬЗОВАТЕЛЯМИ и ADDRESS

Дополнительное ограничение обеспечивает это отношения как настоящие один на один. От создание SHIPPING_ADDRESS_ID столбец уникален, вы заявляете, что можно указать конкретный адрес не более чем одним пользователем, как доставка адрес.Это не так сильно, как гарантия от общего первичного ключа ассоциация, которая позволяет конкретному адрес, на который будет ссылаться самое большее один пользователь, точка. С несколькими зарубежными ключевые столбцы (допустим, у вас также есть уникальный HOME_ADDRESS_ID и BILLING_ADDRESS_ID ), вы можете ссылка на ту же целевую строку адреса несколько раз. Но в любом случае два пользователи не могут использовать один и тот же адрес для та же цель.

Давайте установим связь с пользователем Обращаться двунаправленно.

Ссылка на обратное свойство

Последняя ассоциация внешнего ключа была сопоставлен от пользователя к адресу с и уникальный ограничение, чтобы гарантировать желаемое множественность. Какой элемент отображения может вы добавляете на стороне адреса, чтобы сделать эта ассоциация двунаправленная, поэтому что доступ от Адреса к Пользователю возможно ли в модели предметной области Java?

В XML вы создаете отображение со ссылкой на свойство атрибут:

 <однозначное имя = "пользователь"
class = "Пользователь"
property-ref = "shippingAddress" />

Вы сообщаете Hibernate, что пользователь свойство класса Address является инверсия собственности на другом сторона ассоциации. Ты можешь сейчас вызовите anAddress.getUser () для доступа пользователь, адрес доставки которого у вас данный. Дополнительного столбца нет или ограничение внешнего ключа; Спящий режим управляет этим указателем за вас.

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

2
ответ дан 2 September 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: