我上了一堂一对一的关系。基本上,在“ A类”中,我与“ B类”具有一对一关系。此关系使用主键联接列。现在我的问题如下,如果我尝试创建A的实例,则无法保存它,因为尚未向其添加B的实例。但是,我无法创建B的实例,因为我首先需要A的ID。
一个简单的解决方案是使B中的ID自动生成,因此我可以在创建A实例之前创建B实例。但是,我确定有更好的方法吗? :)
我可以在数据库中看到休眠状态在A的id列上创建了另一个索引,我猜这是一个外键约束。而且我可以看到文档,其中一对一映射的XML版本具有一个属性来指定关系是否受约束,但是@OneToOne注释似乎没有此选项? :S
最佳答案
看来在A
和B
表之间有两个关系(您具有:A
具有a_id
,b_id
; B
具有b_id
,a_id
)。要建模one to one
,您只需一个关系。确定哪个表是“主”表,然后从“辅助”表中删除列(应为:A
具有a_id
,b_id
; B
具有b_id
)。之后,休眠(和任何其他架构客户端)将能够首先插入B
,然后参照A
表插入到B
。
例如鸡蛋和鸡肉。鸡蛋和鸡之间有多种关系(一只鸡可以产下许多鸡蛋;一只鸡蛋可以产下一只鸡)。因此,对于one to one
关系egg-produces-chicken,在parent_egg_id
表中具有chicken
列是合理的,因此可以先创建一个鸡蛋,然后再参照该鸡蛋创建一个鸡。
休眠映射可能如下所示:
在鸡班:
@OneToOne
@JoinColumn(name = "parent_egg_id")
public Egg getParentEgg() {
return parentEgg;
}
在蛋类中:
@OneToOne(mappedBy = "parentEgg")
public Chicken getChildChicken() {
return childChicken;
}
更新:
与xml中的
constrained
相同,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
语句。)。