如何在hibernate hbm文件中创建可选的一对一映射?例如,假设我有一个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映射可选?
答案 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_page表中不会有该用户的任何元组, (b)某个给定用户只有一个last_visited页面,在这种情况下,last_visited_page表中只有一个该用户的元组。
这应该表明userid是你上次访问过的页面表中的候选键。
这应该表明你应该向DBMS声明该密钥。