我上了一堂一对一的关系。基本上,在“ A类”中,我与“ B类”具有一对一关系。此关系使用主键联接列。现在我的问题如下,如果我尝试创建A的实例,则无法保存它,因为尚未向其添加B的实例。但是,我无法创建B的实例,因为我首先需要A的ID。

一个简单的解决方案是使B中的ID自动生成,因此我可以在创建A实例之前创建B实例。但是,我确定有更好的方法吗? :)

我可以在数据库中看到休眠状态在A的id列上创建了另一个索引,我猜这是一个外键约束。而且我可以看到文档,其中一对一映射的XML版本具有一个属性来指定关系是否受约束,但是@OneToOne注释似乎没有此选项? :S

最佳答案

看来在AB表之间有两个关系(您具有:A具有a_idb_idB具有b_ida_id)。要建模one to one,您只需一个关系。确定哪个表是“主”表,然后从“辅助”表中删除列(应为:A具有a_idb_idB具有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行。我会考虑从BA,而不是从AB。在这种情况下,要在A中然后在B中创建项目,需要两个insert语句(从AB的关系-需要附加的update A语句。)。

09-30 17:10