Необязательное сопоставление "один-к-одному" в Hibernate

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

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

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

LastVisitedPage Класс:

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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