鸡蛋或蛋型hibernate映射问题

时间:2011-09-11 20:48:49

标签: java hibernate

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

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

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

1 个答案:

答案 0 :(得分:2)

AB表之间似乎有两种关系(Aa_idb_id; B b_ida_id)。要建模one to one,您只需要一种关系。确定哪个表格为“主要”,然后从“辅助”表中删除列(应该是:Aa_idb_id; Bb_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的行。我会考虑从BA,而不是从AB。在这种情况下,要在A中创建项目,然后在B中,需要两个insert语句(从AB的关系 - 其他update A }声明是必需的。)。