我得到了一对一对一的关系。基本上,在“A类”中,我与“B类”有一对一的关系。此关系使用主键连接列。现在我的问题如下,如果我尝试创建A的实例,我无法保存它,因为我还没有添加B的实例。但是,我无法创建B的实例,因为我首先需要A的ID。
一个简单的解决方案是使B中的ID成为自动生成的ID,这样我就可以在创建A的实例之前创建B的实例。但是,我确定有更好的方法可以做到这一点吗? :)
我可以在数据库中看到hibernate在A的id列上创建了一个额外的索引,我猜测它是一个外键约束。我可以看到一对一映射的XML版本具有指定关系是否受约束的属性的文档,但@OneToOne注释似乎没有这个选项? :S
答案 0 :(得分:2)
您A
和B
表之间似乎有两种关系(A
有a_id
,b_id
; B
b_id
,a_id
)。要建模one to one
,您只需要一种关系。确定哪个表格为“主要”,然后从“辅助”表中删除列(应该是:A
有a_id
,b_id
; B
有b_id
) 。之后,hibernate(以及任何其他模式客户端)将首先插入B
,然后参考A
表格B
。
例如鸡蛋和鸡肉。鸡蛋和鸡之间有多种关系(一只鸡可以产下许多鸡蛋;一只鸡可以产一只鸡)。因此,对于one to one
关系egg-produce-chicken,在parent_egg_id
表中有chicken
列是合理的,因此可以先创建一个鸡蛋,然后再参考该鸡蛋创建鸡
Hibernate映射可能如下所示:
鸡类:
@OneToOne
@JoinColumn(name = "parent_egg_id")
public Egg getParentEgg() {
return parentEgg;
}
在Egg课程中:
@OneToOne(mappedBy = "parentEgg")
public Chicken getChildChicken() {
return childChicken;
}
<强>更新强>
与constrained
接口中的xml,optional
属性中的OneToOne
相同。它默认为true,因此默认情况下该关系可以为空。
/**
* (Optional) Whether the association is optional. If set
* to false then a non-null relationship must always exist.
*/
boolean optional() default true;
根据您的评论,首先插入到A
的行。我会考虑从B
到A
,而不是从A
到B
。在这种情况下,要在A
中创建项目,然后在B
中,需要两个insert
语句(从A
到B
的关系 - 其他update A
}声明是必需的。)。