7

我正在创建一个一对多的关系。所以,我有一个父母和一个孩子。级联属性设置为全部。

我想知道,如果我们考虑以下代码:

Parent p = (Parent) session.load(Parent.class, pid); 
Child c = new Child("child element");
p.addChild(c);
session.flush();
  • Q1) 如果父级拥有关系,例如,对于父级 inverse=false,那么子元素添加是否会在数据库中更新?
  • Q2) 如果子元素拥有关系,如在 中,对于父元素 inverse=true,那么子元素添加是否会在数据库中更新?
  • Q3) 谁拥有relationahsip 在上面的代码中是否会看到updaet 没有区别?

多谢

4

4 回答 4

5

大小写反转 = 假:

在这种情况下,保存更新孩子及其关系是父母的责任。所以在你的例子中,孩子将在数据库中更新。将有两个 sql 查询:1)插入子。2)用父ID的外键更新子。

情况反转=真:

在这种情况下,保存更新本身是孩子的责任。因此,在您的代码中,子项将保存在数据库中,但父项的外键将为空。只会执行一个 sql 查询,即插入子查询。要更新父级的外键,您需要手动保存子级。

Child child = new Child();
child.setParent(parent);
session.save(child);

我认为,这些案例的答案解释了你第三个问题的答案。

希望这有帮助。

于 2011-06-21T11:25:01.757 回答
3

Inverse 只是告诉 NH,外键被映射了两次,通常是一对多和多对一,因此只需要从一侧存储。

Q1) child 是通过级联存储的,但是 parent-FK 为 null。(除非您在子级中设置父关系p.addChild(c)。)

Q2) 与 Q1 相同。

Q3) 完全正确。

于 2011-06-21T14:59:29.973 回答
1

如果我们使用 inverse=true,则意味着孩子负责更新关系。强制子对象应包含父对象,否则不更新外键。

于 2016-07-20T09:14:44.533 回答
0

在两个不同实体之间的父子关系中,

例如一对多(1:N)或多对一(N:1)

父 <-> 子。(所有者)(反向)

如果父母是所有者,那么孩子就是它的反面。

使用逆总是检查孩子。

默认情况下,我们总是从父方考虑。所以默认情况下 inverse = false 意味着父母是所有者。

如果 inverse=true 则孩子是所有者。因此,实体的持久化将始终来自所有者方面。

于 2016-08-02T17:51:46.580 回答