Ответ 1
Насколько мне известно, Hibernate не поддерживает опционально один-к-одному (см. HHH-2007), поэтому вам придется использовать вместо подделки many-to-one
с not-null="false"
.
Как создать необязательное сопоставление "один-к-одному" в файле 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?
Насколько мне известно, Hibernate не поддерживает опционально один-к-одному (см. HHH-2007), поэтому вам придется использовать вместо подделки many-to-one
с not-null="false"
.
Просто проводите большую часть дня сегодня, пытаясь сделать подобное, наконец нашли следующее решение (просто в случае, если это может быть полезно для других людей)
@OneToOne
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true)
Надеюсь, что может помочь кому-то помочь некоторое время
У меня была проблема simliar, но с использованием аннотаций. Google привел меня сюда, поэтому, если кто-то еще окажется в одних и тех же ситуациях, это сработало для меня:
http://opensource.atlassian.com/projects/hibernate/browse/ANN-725
Если вы используете аннотации, вы можете использовать аннотацию @NotFound (action = NotFoundAction.IGNORE), чтобы вы не получали исключение. Просто убедитесь, что ваш код проверяет наличие нулей, потому что он теперь может быть не там; -)
Если пользователь имеет не более одной последней страницы, то есть два случая:
(a) у какого-то данного пользователя нет последней страницы, в этом случае для этого пользователя не будет никаких кортежей в таблице last_visited_page, (b) у определенного пользователя есть ровно одна last_visited страница, и в этом случае для этого пользователя будет только один кортеж в таблице last_visited_page.
Это должно сделать очевидным, что userid является ключом-кандидатом в вашей таблице с последней посещаемой страницей.
И это должно сделать очевидным, что вы должны объявить этот ключ для СУБД.