我正在建立一对多的关系。所以,我有一个父母和一个孩子。 cascade属性设置为all。
我想知道,如果我们考虑以下代码:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child("child element");
p.addChild(c);
session.flush();
非常感谢
答案 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则孩子是所有者。因此,实体的持久性将始终取自所有者。