Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@OneToOne与多个对象的关系?_Java_Hibernate_One To One_Hibernate Annotations - Fatal编程技术网

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

Java Hibernate@OneToOne与多个对象的关系?,java,hibernate,one-to-one,hibernate-annotations,Java,Hibernate,One To One,Hibernate Annotations,如果我有一张这样的桌子 +------------------------------------------------------+ | Code | +------------------------------------------------------+ | id | target_uuid | code | +----+----

如果我有一张这样的桌子

+------------------------------------------------------+
|                         Code                         |
+------------------------------------------------------+
| id |               target_uuid              |  code  |
+----+----------------------------------------+--------+
|  1 | "01BE898A-C5A9-4F86-B0AA-4ACCDCE81B8F" |    0   |
+----+----------------------------------------+--------+
|  2 | "E139F21E-8C93-492B-9E0F-CC773FAE832D" |    2   |
+----+----------------------------------------+--------+
…而且
target_uuid
可能引用
Post
User
uuid字段,我如何在Hibernate中映射它

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

我试过这个:

@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
}
这不会引发异常并且似乎有效,但my
User
Post
对象的
code
属性不断获取空值


有人能解释一下吗?

正如评论中所解释的,这种关联是不可能映射为双向关联的。不过,只需将JoinColumn注释的referencedColumnName设置为“target\u uuid”,您的代码意味着每个帖子都与一个“Code”相关,就可以将其映射为一个从帖子到代码(以及从用户到代码)的OneToOne单向关联。我不确定“target_uuid可以引用帖子或用户”这句话对用户和“代码”之间的关系意味着什么?因此,我将只关注“post”和“code”。关于“uuid”,您还有一个模棱两可的声明。“uuid不是主键f”。好的,但它是“钥匙”吗?我想是的

让我们翻译一下: 邮政编码为1。表示post表包含外键:

 FOREIGN KEY (uuid) REFERENCES code(target_uuid)
关系存储在“post”表中,而不是“code”表中

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

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


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

代码表中的“代码”列是什么?它是一个鉴别器,允许识别目标_uuid指向什么?代码只是一个魔术数字,在业务逻辑层意味着什么。编辑:代码表本质上是连接表和实际数据表的糟糕混搭,其中“代码”是post或用户关心的数据。那么我认为不可能将其映射到Hibernate,除非您可以保证post不能具有与用户相同的ID(在这种情况下,您可以使用继承来映射此ID)。将此目标映射为字符串,并进行两次查询以查找与代码关联的用户或帖子。在Post和用户端,您可以有一个单向的OneTONE关联。UUID很可能是唯一的。另外,Post和User都实现了相同的接口,所以可以使用继承吗?或者我需要创建一个基类吗?您只需要一个带有JoinColumn注释的OneToOne,其referencedColumnName属性设置为“target_uuid”。谢谢,这非常有用。我接受了另一位用户的回答,因为他在评论中首先给出了答案,但你们都说了同样的话,并且在这里做了很好的说明+1冷却液。很高兴能帮忙:)
@JoinColumn(name = "code_id", referencedColumnName = "target_uuid")
@OneToOne(optional = false)
private Code codeId;