Hibernate中可选的一对一映射

时间:2010-05-06 20:26:57

标签: java database hibernate one-to-one

如何在hibernate hbm文件中创建可选的一对一映射?例如,假设我有一个User和一个last_visited_pa​​ge表。用户可能有也可能没有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映射可选?

5 个答案:

答案 0 :(得分:13)

据我所知,Hibernate不支持可选的一对一(请参阅HHH-2007),因此您必须使用假的many-to-one代替not-null="false"

答案 1 :(得分:10)

今天大部分时间都在尝试做类似的事情,最后找到了以下解决方案(以防万一这可能对其他人有用)

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

希望这可能有助于为某人节省一些时间

答案 2 :(得分:5)

我有一个simliar问题,但使用注释。谷歌把我带到了这里,所以如果其他人发现自己处于相同的位置,这对我有用:

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

如果您正在使用注释,则可以使用@NotFound(action = NotFoundAction.IGNORE)注释,以便不会出现异常。只需确保您的代码检查空值,因为它现在可能不存在; - )

答案 3 :(得分:1)

有同样的问题,在User类(hibernate 5.2.17.Final)上使用@OneToOne(optional = true)解决了

答案 4 :(得分:0)

如果用户最多有一个last_visited页面,则有两种情况:

(a)某个给定用户没有last_visited页面,在这种情况下,last_visited_pa​​ge表中不会有该用户的任何元组, (b)某个给定用户只有一个last_visited页面,在这种情况下,last_visited_pa​​ge表中只有一个该用户的元组。

这应该表明userid是你上次访问过的页面表中的候选键。

这应该表明你应该向DBMS声明该密钥。