当前位置: 首页 > 面试题库 >

何时在NHibernate / Hibernate OneToMany关系上使用inverse = false?

汪天宇
2023-03-14
问题内容

我一直试图了解Hibernate的inverse属性,但这似乎只是概念上困难的事情之一。

我得到的要点是,当您拥有一个使用 一对多 映射的Child对象集合的父实体(例如Parent)时,在映射上设置inverse =
true会告诉Hibernate’另一面(子)有责任自行更新以维护其表中的外键引用。

在将Children添加到代码中的集合中,然后保存Parent(设置了cascade-
all)时,这样做似乎有两个好处:您可以在数据库上保存不必要的命中(因为没有设置反向,Hibernate认为这样)有两个地方可以更新FK关系),并且根据官方文档:

如果关联的列声明为NOT
NULL,则NHibernate在创建或更新关联时可能会导致约束冲突。为避免此问题,您必须使用双向关联,并将多个有价值的末端(集合或袋子)标记为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,则永远不会更新。



 类似资料:
  • 我有一个问题,当坚持一个实体和它的孩子在一对多的关系。这里我的两个实体: 现在是生成ORA-02291错误的持久化操作: 有办法解决这个问题吗? 谢谢大家!

  • 问题内容: 可以有人帮我。我正在尝试某些东西,但是对(my)SQL不熟悉。 我使用两个表:项目和类别。表项目有一个带有外键的字段:category_id。 我希望表类别保持整洁。因此,如果“项目”中没有任何项目属于“类别”中的X类别,则应从“类别”中删除类别X。您如何确定这一点。我通过使用DELETE ON CASCADE进行猜测,但是到目前为止,当我从“类别”中删除类别时,它只是从“项目”中删除

  • 很好的一天。我在我维护的代码中看到了这个片段。我试着去理解它的意思(比如我甚至需要向别人解释)。谁能帮助简化?代码如下所示。 这和说

  • 我需要使用nHibernate读取postgis几何列作为wkt。我知道我可以使用nHibernate空间,但在我的情况下这不是一个选项。 我看过这个帖子:在NHibernate (fluent)中映射隐藏属性的最佳方式,其中wkt存储在另一列中,他使用触发器来更新实际的几何图形。然而,项目业主不希望为此增加一个额外的栏目。 我也发现了这个主题:在Hibernate中透明地使用PostGIS列,但

  • 说我有这样的关系 那么,我是否可以说这种关系是一种关联,而不是聚合或组合。 我可以说狮子使用食物并像这样绘制UML图吗 此外,这种关系也没有多重性,因为Lion没有Food数组,食物也没有Lions数组作为实例变量。不同于复合和聚合,其中关系具有多重性。 如果我希望Food也能以同样的方式使用Lion呢。我在两个班级之间画两个箭头吗?

  • 问题内容: 有没有办法使用NHibernate将枚举持久化到数据库?那有一张代码表和枚举中每个值的名称。 我想保留没有实体的枚举,但仍然具有从所有其他引用实体到枚举的表的外键(枚举的int表示形式)。 问题答案: 你们为什么把这个复杂化呢?真的很简单。 映射如下所示: 该模型属性如下所示: 枚举看起来像这样: NHibernate将自动解决所有问题。为什么键入比您需要的更多???