gpt4 book ai didi

java - Chicken or egg类型hibernate映射问题

转载 作者:行者123 更新时间:2023-11-30 09:45:57 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您似乎在 AB 表之间有两个关系(您有:Aa_idb_id; Bb_id, a_id)。要为一对一建模,您只需要一种关系。确定哪个表是“主”表,然后从“次要”表中删除列(应该是:Aa_idb_id Bb_id)。之后 hibernate (和任何其他模式客户端)将能够首先插入到 B,然后引用 B 表插入到 A

例如鸡蛋和鸡肉。鸡蛋和鸡之间存在多重关系(一只鸡可以下很多蛋;一个鸡蛋可以生一只鸡)。所以对于 one to one 关系 egg-produces-chicken,在 chicken 表中有 parent_egg_id 列是合理的,所以鸡蛋可以是首先创建了一只鸡,然后引用那个鸡蛋创建了一只鸡。

Hibernate 映射可能如下所示:

在鸡类中:

@OneToOne
@JoinColumn(name = "parent_egg_id")
public Egg getParentEgg() {
return parentEgg;
}

在 Egg 类中:

@OneToOne(mappedBy = "parentEgg")
public Chicken getChildChicken() {
return childChicken;
}

更新:

与xml中的constrained一样,OneToOne接口(interface)中的optional属性也可以。它默认为 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 语句(与 A 的关系到 B - 需要额外的 update A 语句。)。

关于java - Chicken or egg类型hibernate映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7381141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com