Дополнительное сопоставление «один к одному» в Hibernate - PullRequest
16 голосов
/ 07 мая 2010

Как создать необязательное сопоставление «один к одному» в файле hibernate hbm? Например, предположим, что у меня есть таблица User и last_visited_page. Пользователь может иметь или не иметь страницу last_visited. Вот мое текущее сопоставление один-к-одному в файле hbm:

Класс пользователя:

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update">

LastVisitedPage Class:

<one-to-one name="user" class="user" constrained="true" />

Приведенный выше пример не позволяет создать пользователя, у которого нет последней посещенной страницы. Недавно созданный пользователь еще не посещал ни одной страницы. Как изменить отображение hbm, чтобы сделать отображение userPrefs необязательным?

Ответы [ 5 ]

13 голосов
/ 07 мая 2010

Насколько мне известно, Hibernate не поддерживает опциональный один-к-одному (см. HHH-2007 ), поэтому вам придется использовать поддельный many-to-one с not-null="false".

10 голосов
/ 12 сентября 2011

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

@OneToOne
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true)

Надеюсь, это поможет кому-нибудь сэкономить время

5 голосов
/ 22 декабря 2010

У меня была проблема с симлиаром, но я использовал аннотации. Google привел меня сюда, поэтому, если кто-то еще окажется в таких же ситуациях, это сработало для меня:

http://opensource.atlassian.com/projects/hibernate/browse/ANN-725

Если вы используете аннотации, вы можете использовать аннотацию @NotFound (action = NotFoundAction.IGNORE), чтобы не получить исключение. Просто убедитесь, что ваш код проверяет наличие нулей, потому что его сейчас может не быть; -)

1 голос
/ 10 мая 2018

Была та же проблема, решенная с помощью @OneToOne(optional = true) в классе User (hibernate 5.2.17.Final)

0 голосов
/ 07 мая 2010

Если у пользователя есть не более одной страницы last_visited, то есть два случая:

(a) у данного пользователя нет страницы last_visited, и в этом случае в таблице last_visited_page для этого пользователя не будет никакого кортежа, (b) у некоторого данного пользователя ровно одна страница last_visited, и в этом случае в таблице last_visited_page будет ровно один кортеж для этого пользователя.

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

И это должно сделать очевидным, что вы должны объявить этот ключ к СУБД.

...