正如 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>
Spymasters 可以有间谍,但间谍永远不知道他们的 spymaster 是谁,因为我们没有在 spy 类中包含多对一的关系。此外(方便地)间谍可能会变成流氓,因此不需要与间谍大师相关联。我们可以如下创建实体:
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 将永远不会更新。