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
}
这不会引发异常并且似乎有效,但myUser
和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;