2

第 5.2.1.1 节有示例 A - C,看起来有点混乱:

示例 B:这仍然是多对一的关系,如示例 A(即相同的表设置)吗?最后它说,“要实现真正的一对一,请使用 hasOne 属性......”。

示例C:当使用hasOne时,是否应该不再使用belongsTo?是暗示吗?

为什么他们在示例 C 中显示了两个变体?第一个容易出问题吗?

我试图了解所有有效的多对一和一对一组合。

谢谢

4

1 回答 1

3

我同意他们的术语在这里有点混乱。但我会尽力帮助:

多对一 (A)

他们在这里指的是父对象指向单个子对象的关系。然而,子对象不知道父关系。(我相信)他们称之为多对一的原因是没有强制执行唯一的一对一映射。从技术上讲,只需将相同的鼻子保存到关系中,就可以在多个面孔上使用它们。而且,如果您删除Face,则Nose继续存在,只是没有脸。 (这写起来很奇怪!)

一对一存储在 Parent 表 (B)

在第二个示例中,他们添加了belongsTo以强制建立一对一的关系。这意味着Nose的存在取决于Face的存在。所以,现在是真正的一对一关系。由于其配置方式,此关系的外键存储在Face表中(请参阅下一节)。

一对一存储在 Child 表上 (C)

在最后一个示例中,它仍然是一对一的。但是,将 simple 更改Nose nosestatic hasOne = [nose:Nose]已将外键移至Nose表。在这种情况下,您使用 ,belongsTo因为每个Nose只能与单个Face相关。

总之

  • 一个简单的分配Model model创建一个单一的,与孩子的单向关系。child 没有直接的方式来引用 parent 关系,实际上可能与多个 parent 模型有关。
  • 双向的一对一分配要求子belongTo代为其父代,这也通过级联来强制数据完整性。
  • hasOne通过将父级配置为具有一个 ( ) 子级模型来创建存储在子级上的双向一对一。

希望这会有所帮助。(我仍然认为多对一术语很尴尬。)

于 2011-08-14T18:20:53.147 回答