【问题标题】:Hibernate @OneToOne relationship with multiple objects?Hibernate @OneToOne 与多个对象的关系?
【发布时间】:2014-02-14 16:56:28
【问题描述】:

如果我有这样的桌子......

+------------------------------------------------------+
|                         Code                         |
+------------------------------------------------------+
| id |               target_uuid              |  code  |
+----+----------------------------------------+--------+
|  1 | "01BE898A-C5A9-4F86-B0AA-4ACCDCE81B8F" |    0   |
+----+----------------------------------------+--------+
|  2 | "E139F21E-8C93-492B-9E0F-CC773FAE832D" |    2   |
+----+----------------------------------------+--------+

...target_uuid 可以引用 PostUser uuid 字段,我将如何在 Hibernate 中映射它?

这里假设 uuid 不是 PostUser 的主键。我知道我知道。糟糕的数据模型,但我坚持使用它。

我试过这个:

@Entity
@Table(name = "User")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "uuid")
    private String uuid;

    @OneToOne(mappedBy = "user")
    @JoinColumn(name = "uuid")
    private Code code;

    // getters and setters
}

@Entity
@Table(name = "Post")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "uuid")
    private String uuid;

    @OneToOne(mappedBy = "post")
    @JoinColumn(name = "uuid")
    private Code code;

    // getters and setters
}

@Entity
@Table(name = "Code")
public class Code {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "code")
    private Integer code;

    @Column(name = "target_uuid")
    private String targetUuid;

    @OneToOne
    @JoinColumn(name = "target_uuid", insertable = false, updatable = false)
    private User user;

    @OneToOne
    @JoinColumn(name = "target_uuid", insertable = false, updatable = false)
    private Post post;

    // getters and setters
}

这不会引发异常并且似乎有效,但我的 UserPost 对象的 code 属性不断获得 NULL 值。

有人能解释一下吗?

【问题讨论】:

  • 代码表中的“代码”列是什么?它是允许识别 target_uuid 指向什么的鉴别器吗?
  • 代码只是一个神奇的数字,在业务逻辑层中意味着某些东西。编辑:代码表本质上是连接表和实际数据表的设计不佳的混搭,“代码”是帖子或用户关心的数据。
  • 那么我认为不可能将其映射到 Hibernate,除非您可以保证 Post 不能与 User 具有相同的 ID(在这种情况下您可以使用继承来映射它)。将此 target_uuid 映射为字符串,并进行两次查询以查找与代码关联的用户或帖子。在 Post 和 User 端,你可以有一个单向的 OneToOne 关联。
  • 嗯,UUID 极有可能是唯一的。另外, Post 和 User 都实现了相同的接口,所以可以使用继承吗?还是我需要创建一个基类?
  • 您只需要一个带有 JoinColumn 注释的 OneToOne,其 referencedColumnName 属性设置为“target_uuid”。

标签: java hibernate one-to-one hibernate-annotations


【解决方案1】:

如 cmets 中所述,AFAIK 无法将这种关联映射为双向关联。不过,您可以将其映射为从 Post 到 Code(以及从 User 到 Code)的 OneToOne 单向关联,只需将 JoinColumn 注释的 referencedColumnName 设置为 "target_uuid"

【讨论】:

    【解决方案2】:

    您的代码意味着每个帖子都与 1 个“代码”相关。我不确定“target_uuid 可以引用帖子或用户”这句话对用户和“代码”之间的关系有何暗示?因此,我将只关注“post”和“code”。您还有关于“uuid”的模棱两可的声明。 “uuid 不是主键 f”。好的,但它是“钥匙”吗?我会假设它是。

    让我们翻译一下: 帖子有 1 个“代码”。表示 post 表包含外键:

     FOREIGN KEY (uuid) REFERENCES code(target_uuid)
    

    关系存储在“post”表中,而不是“code”表中。

    想想书籍和作者。每本书都有一位作者。关系与书(而不是作者)一起存储。

    现在是 JPA(在“Post”实体中,而不是“Code”实体中)

    @JoinColumn(name = "code_id", referencedColumnName = "target_uuid")
    @OneToOne(optional = false)
    private Code codeId;
    

    总而言之,您需要定义“帖子”和“用户”实体的关系。不在“代码”实体上。也许我没有理解你的要求。希望对您有所帮助:)

    【讨论】:

    • 谢谢,这很有帮助。我接受了另一个用户的回答,因为他首先在 cmets 中将其钉牢,但是你们俩都说了同样的话,并且在这里说明它做得很好。 +1
    • 酷。很高兴有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-04-23
    • 2011-12-15
    • 2014-01-21
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多