如果我有这样的表...Hibernate @OneToOne与多个对象的关系?
+------------------------------------------------------+
| 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
}
这并不抛出异常,似乎工作,但我User
和Post
对象一直为他们code
性能得到NULL值。
任何人都可以对此有所了解吗?
什么是代码表中的“代码”列?它是一个鉴别器,可以识别target_uuid指向什么? –
代码只是一个幻数,意味着业务逻辑层中的某些东西。编辑:代码表本质上是一个连接表和实际数据表的设计很差的混搭,'代码'是一个职位或用户关心的数据。 –
然后我不认为有可能把它映射到Hibernate,除非你可以保证Post不能和用户拥有相同的ID(在这种情况下你可以使用继承来映射它)。将此target_uuid映射为字符串,并进行两个查询以查找与该代码关联的用户或帖子。在邮政和用户方,你可以有一个单向的OneToOne关联。 –