使用FK映射一对一地休眠

时间:2014-11-03 12:29:35

标签: java hibernate

我遇到这种情况:

Class A {

   @Id
   Integer id;

   @OneToOne
   @JoinColumn(name = "b.a_id", referencedColumnName = "id")
   B b;
}

Class B {

   @Id
   Integer id;


   Integer a_id;
}

FK在B表中。

运行以下查询不起作用:

SELECT A1 FROM A A1 LEFT JOIN FETCH A1.b WHERE A1.id = 6;

我没有得到B.

另外,如果我让hibernate生成数据库,它会在A表中设置一个FK,但我希望它在B表上。 不应该有双向映射。

请帮助,我该怎么做?

3 个答案:

答案 0 :(得分:1)

我认为一种可能的解决方案是将B类设置为关系的所有者方。您还可以使用其他外部表来管理关系,请参阅this

@Entity
public class A {
    @Id
    private Integer id;

    @OneToOne(mappedBy = "a")
    private B b;
}

@Entity
public class B {
    @Id
    private Integer id;

    @OneToOne
    @JoinColumn(name = "a_id")
    private A a;

}

mysql> desc A;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc B;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| a_id  | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+

答案 1 :(得分:0)

如果你想拥有单向@OneToOne,在目标表中使用外键,请尝试使用

@OneToOne
@JoinColumn(name = "a_id", insertable = false, updateable = false)
B b;

insertable = false, updateable = false应该指示hibernate在目标表中查找连接列。

答案 2 :(得分:0)

好的,在尝试了几乎所有的东西后,我不得不妥协并决定采用双向映射。

这很容易解决所有问题。

我放入了A side mappedBy,我把@JoinColumn放在了B类的A属性上。

感谢大家的帮助。