2010-05-06 4 views
15

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

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

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

LastVisitedPage Класс:

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

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

ответ

12

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

0

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

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

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

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

4

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

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

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

9

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

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

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

+2

Просто FYI - это временное решение имеет проблемы, если вы используете Envers (вы получите сообщение об ошибке: https: //hibernate.onjira. ком/просмотр/HHH-3853). Однако Hibernate 3.6.8 исправил проблему с необязательным сопоставлением @OneToOne. – Phyxx

Смежные вопросы