【发布时间】: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 可以引用 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 不能与 User 具有相同的 ID(在这种情况下您可以使用继承来映射它)。将此 target_uuid 映射为字符串,并进行两次查询以查找与代码关联的用户或帖子。在 Post 和 User 端,你可以有一个单向的 OneToOne 关联。
-
嗯,UUID 极有可能是唯一的。另外, Post 和 User 都实现了相同的接口,所以可以使用继承吗?还是我需要创建一个基类?
-
您只需要一个带有 JoinColumn 注释的 OneToOne,其 referencedColumnName 属性设置为“target_uuid”。
标签: java hibernate one-to-one hibernate-annotations