Hibernate Inverse属性

时间:2011-06-21 10:33:36

标签: hibernate inverse

我正在建立一对多的关系。所以,我有一个父母和一个孩子。 cascade属性设置为all。

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

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)谁拥有关系是不会在以上代码中看到updaet是否会被看到?

非常感谢

4 个答案:

答案 0 :(得分:5)

案例逆=假:

在这种情况下,父母有责任保存更新子女及其关系。因此,在您的示例中,将在数据库中更新子项。将有两个SQL查询:1)插入子。 2)用父ID的外键更新子。

Case Inverse = true:

在这种情况下,孩子有责任自行保存更新。所以在你的代码中,child将被保存在数据库中,但parent的外键将为null。只执行一个sql查询,即insert子项。要更新父级外键,您需要手动保存子级。

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

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

希望得到这个帮助。

答案 1 :(得分:3)

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

Q1)子级通过级联存储,但父级FK为空。 (除非您在p.addChild(c)内的子项中设置父关系。)

Q2)与Q1相同。

Q3)确切。

答案 2 :(得分:1)

如果我们使用inverse = true,则表示孩子负责更新关系。必须的子对象应该包含父对象,否则外键不会更新。

答案 3 :(得分:0)

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

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

父母< - >儿童。 (所有者)(反向)

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

使用逆是总是检查孩子。

默认情况下,我们总是从父方面考虑。因此,默认情况下,inverse = false表示父项是所有者。

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