我一直在尝试掌握 Hibernate 的逆属性,它似乎只是概念上困难的事情之一。
我得到的要点是,当您有一个父实体(例如 Parent),该实体具有使用一对多映射,在映射上设置 inverse=true 告诉 Hibernate “另一端(子进程)有责任更新自身以维护其表中的外键引用”。
在将子项添加到代码中的集合中,然后保存父级(设置了级联所有)时,这样做似乎有两个好处:您可以节省对数据库的不必要的点击 http://nhprof.com/Learn/Alert?name=SuperfluousManyToOneUpdate(因为没有逆集,Hibernate认为它有两个地方可以更新FK关系),并且根据官方文档:
如果列a
宣布关联
NOT NULL,NHibernate 可能会导致
创建时违反约束
或更新关联。阻止
这个问题,你必须使用
与 的双向关联
许多有价值的末端(套装或包)
标记为 inverse="true"。
到目前为止,这一切似乎都有道理。我不明白的是:你什么时候会NOT想要在一对多关系上使用 inverse=true 吗?
正如 Matthieu 所说,您不想设置 inverse = true 的唯一情况是子级负责更新自身没有意义,例如子级不了解其父级的情况。
让我们尝试一个真实的世界,而不是一个人为的例子:
<class name="SpyMaster" table="SpyMaster" lazy="true">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Name"/>
<set name="Spies" table="Spy" cascade="save-update">
<key column="SpyMasterId"/>
<one-to-many class="Spy"/>
</set>
</class>
<class name="Spy" table="Spy" lazy="true">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Name"/>
</class>
间谍大师可以有间谍,但间谍永远不知道他们的间谍大师是谁,因为我们没有在间谍类中包含多对一的关系。此外(方便地)间谍可能会变得流氓,因此不需要与间谍头子有联系。我们可以按如下方式创建实体:
var sm = new SpyMaster
{
Name = "Head of Operation Treadstone"
};
sm.Spies.Add(new Spy
{
Name = "Bourne",
//SpyMaster = sm // Can't do this
});
session.Save(sm);
在这种情况下,您可以将 FK 列设置为可为空,因为保存 sm 的操作将插入到 SpyMaster 表和 Spy 表中,并且只有在此之后,它才会更新 Spy 表以设置 FK。在这种情况下,如果我们设置 inverse = true,FK 将永远不会更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)