Java Hibernate中可选的一对一映射
如何在hibernate hbm文件中创建可选的一对一映射?例如,假设我有一个用户和一个最近访问的页面表。用户可能有也可能没有最后访问的页面。以下是我当前在hbm文件中的一对一映射: 用户类别:Java Hibernate中可选的一对一映射,java,database,hibernate,one-to-one,Java,Database,Hibernate,One To One,如何在hibernate hbm文件中创建可选的一对一映射?例如,假设我有一个用户和一个最近访问的页面表。用户可能有也可能没有最后访问的页面。以下是我当前在hbm文件中的一对一映射: 用户类别: <one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update"> LastVisitedPage类: <one-to-one name="user" class="user" con
<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update">
LastVisitedPage类:
<one-to-one name="user" class="user" constrained="true" />
上述示例不允许创建没有上次访问页面的用户。新创建的用户尚未访问任何页面。如何更改hbm映射以使userPrefs映射成为可选的?据我所知,Hibernate不支持可选的一对一(请参阅),因此您必须使用带有
not null=“false”
的假多对一。如果用户最多有一个最后访问的页面,则有两种情况:
(a) 某些给定用户没有上次访问的页面,在这种情况下,上次访问的页面表中不会有此用户的任何元组,
(b) 某些给定用户恰好有一个上次访问的页面,在这种情况下,在上次访问的页面表中该用户正好有一个元组
这应该可以清楚地表明,userid是您上次访问的页面表中的候选键
很明显,您应该声明DBMS的密钥。我遇到了一个类似的问题,但是使用了注释。谷歌把我带到了这里,所以如果其他人发现自己处于同样的境地,这对我来说很有用:
如果您使用的是注释,那么可以使用@NotFound(action=NotFoundAction.IGNORE)注释,这样就不会出现异常。只需确保代码检查空值,因为它现在可能不在那里;-) 今天的大部分时间都在尝试做类似的事情,最终找到了以下解决方案(以防万一这可能对其他人有用)
希望这可以帮助节省一些时间有同样的问题,通过用户类(hibernate 5.2.17.Final)上的@OneToOne(optional=true)
解决。仅供参考-如果您使用Envers,此解决方法会有问题(您将得到此错误:)。Hibernate 3.6.8通过可选的@OneTONE映射解决了这个问题。2018年这仍然是真的吗?JPA 2.1似乎支持可选的OneTONE,请参阅,或者
@OneToOne
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true)