2014-02-14 49 views
4

如果我有这样的表...Hibernate @OneToOne与多个对象的关系?

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

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

+0

什么是代码表中的“代码”列?它是一个鉴别器,可以识别target_uuid指向什么? –

+0

代码只是一个幻数,意味着业务逻辑层中的某些东西。编辑:代码表本质上是一个连接表和实际数据表的设计很差的混搭,'代码'是一个职位或用户关心的数据。 –

+0

然后我不认为有可能把它映射到Hibernate,除非你可以保证Post不能和用户拥有相同的ID(在这种情况下你可以使用继承来映射它)。将此target_uuid映射为字符串,并进行两个查询以查找与该代码关联的用户或帖子。在邮政和用户方,你可以有一个单向的OneToOne关联。 –

回答

1

正如评论中所解释的那样,这种关联是AFAIK,不可能作为双向关联进行映射。尽管只需将referencedColumnNameJoinColumn注释设置为"target_uuid",但您可以将其映射为从发布到代码(以及从用户到代码)的OneToOne单向关联。

1

您的代码暗示每个帖子都与1个“代码”相关。我不确定“target_uuid可以引用Post或User”的语句暗示了用户和“代码”之间的关系?因此,我将专注于“发布”和“代码”。你也有关于“uuid”的模棱两可的陈述。 “uuid不是主键f”。好吧,但它是一个“关键”?我会假设它是。

让我们来翻译一下: 发布有1个“代码”。这意味着邮政表中包含一个外键:

FOREIGN KEY (uuid) REFERENCES code(target_uuid) 

关系存储在“邮政”表,而不是“代码”表。

想想书和作者。每本书都有一位作者。该关系被存储的书(不是作者。)

现在JPA(在“邮报”的实体,而不是“守则”实体)

@JoinColumn(name = "code_id", referencedColumnName = "target_uuid") 
@OneToOne(optional = false) 
private Code codeId; 

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

+1

谢谢,这非常有帮助。我接受了另一位用户的回答,因为他首先在评论中指出了这一点,但你们都说过同样的事情,并且你在这里做了很好的说明。 +1 –

+0

很酷。很高兴有帮助:) – lorinpa