【问题标题】:Optional one-to-one mapping in HibernateHibernate 中可选的一对一映射
【发布时间】:2011-02-16 13:46:11
【问题描述】:

如何在休眠 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 映射可选?

【问题讨论】:

    标签: java database hibernate one-to-one


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 仅供参考 - 如果您使用 Envers,此解决方法会出现问题(您将收到此错误:hibernate.onjira.com/browse/HHH-3853)。不过,Hibernate 3.6.8 已通过可选的 @OneToOne 映射解决了该问题。
    【解决方案3】:

    我遇到了类似的问题,但使用了注释。谷歌把我带到了这里,所以如果其他人发现自己处于同样的境地,这对我有用:

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

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

    【讨论】:

      【解决方案4】:

      遇到同样的问题,在 User 类上使用 @OneToOne(optional = true) 解决(休眠 5.2.17.Final)

      【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多