Это один к одному или компонент? Nhibernate Mapping - PullRequest
2 голосов
/ 12 февраля 2009

Предположим, что у меня есть классы Person и Address, и у них разные таблицы в БД.

Один человек может иметь один класс адресов. Это важная часть для меня. Один человек может иметь только один адрес в качестве дочернего элемента, и я хочу сохранить их в разных таблицах в БД.

Обычно я знаю, что мне нужно держать их в одной таблице, но мой сценарий нуждается в этом.

(а также выглядит как один ко многим, но я не хочу иметь коллекцию только для одного объекта)

Person     Address
-------    -------
id         id
Name       PersonId
           StreetName

И код класса

Person                                                 
--------
public virtual long Id{get;set;}
public virtual Address MyAddress {get;set;}

Как вы видите, я хочу получить адресную собственность лично, когда я получу какое-либо лицо? Но они есть в разных таблицах. Как сделать это отображение?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 12 февраля 2009

Вы не можете отобразить Адрес, используя компонент, потому что он имеет свою собственную таблицу. Вы можете использовать его, если у вас есть все поля только в одной таблице. Из ссылки на Hibernate:

Элемент компонента отображает свойства дочернего объекта в столбцы таблицы родительского класса.

Вы должны использовать отношение один-к-одному для сопоставления таблиц и классов в вашем сценарии.

1 голос
/ 26 февраля 2009

Для принудительного использования один-к-одному в базе данных вы также можете установить уникальное ограничение на PersonId в таблице адресов.

0 голосов
/ 12 февраля 2009

Я использовал код ниже в Персональном сопоставлении, чтобы сделать это.

<one-to-one lazy="proxy" name="MyAddress" class="Address" property-ref="PersonId" cascade="delete" />

Надежда помогает кому-то еще

0 голосов
/ 12 февраля 2009

Вы уверены, что это отношения один на один? Я бы предположил, что это отношения многие-к-одному, так как обычно по определенному адресу может жить более одного человека.

В любом случае, если бы это были отношения «многие-к-одному», я бы так их отобразил. Что бы я сделал в вашем случае, это удалите PersonId FK из таблицы адресов и поместите ссылку на таблицу адресов из таблицы Person, чтобы у вас было что-то вроде этого.

Person    Address
------    -------
id        id
Name      StreetName
AddressId

<many-to-one name="MyAddress" class="Address" column="AddressId"/>

и если вы настаиваете на отношениях один к одному, я бы порекомендовал объединить две таблицы вместе.

...