我遇到这种情况:
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表上。 不应该有双向映射。
请帮助,我该怎么做?
答案 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属性上。
感谢大家的帮助。