Hibernate @OneToOne与多个对象的关系?

时间:2014-02-14 16:56:28

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

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

+------------------------------------------------------+
|                         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值。

任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

正如评论中所解释的那样,这种关联是AFAIK,不可能映射为双向关联。您可以通过简单地将referencedColumnName注释的JoinColumn设置为"target_uuid"来将其映射为从邮政到代码(以及从用户到代码)的OneToOne单向关联。

答案 1 :(得分:1)

您的代码暗示每个帖子都与1个“代码”相关。我不确定“target_uuid可以引用帖子或用户”这句话暗示了用户与“代码”之间的关系?因此,我将只关注“发布”和“代码”。你也有一个关于“uuid”的含糊不清的陈述。 “uuid不是主要关键词”。好的,但这是一个“关键”吗?我会假设它是。

让我们翻译: 帖子有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;

总结一下,您需要在“发布”和“用户”实体上定义关系。不在“代码”实体上。也许我不明白你的要求。希望有所帮助:)