Section 5.2.1.1有示例 A - C,看起来有点令人困惑:
示例 B:这仍然是多对一关系吗,如示例 A(即相同的表设置)?最后它说:“要实现真正的一对一,请使用 hasOne 属性......”。
示例C:当使用hasOne时,是否应该不再使用belongsTo?是暗示的吗?
为什么示例 C 中显示出两种变化?第一个容易出现问题吗?
我正在尝试理解所有有效的多对一和一对一组合。
谢谢
最佳答案
我同意他们的术语有点令人困惑。但我会尽力提供帮助:
多对一 (A)
他们在这里指的是父对象指向单个子对象的关系。然而,子对象不知道父对象关系。 (我相信)他们称之为多对一的原因是没有强制执行唯一的一对一映射。从技术上讲,只需将多个脸部保存到关系中,就可以在多个脸部上使用相同的 Nose 。而且,如果您删除脸部, Nose 将继续存在,只是没有脸部。 (这写起来很奇怪!)
一对一存储在父表(B)中
在第二个示例中,他们添加了 belongsTo
来强制执行一对一关系。这意味着 Nose 的存在取决于脸的存在。所以,现在这是一个真正的一对一关系。由于其配置方式,此关系的外键存储在 Face 表中(请参阅下一节)。
一对一存储在子表(C)上
在最后一个例子中,它仍然是一对一的。但是,将简单的 Nose nose
更改为 static hasOne = [nose:Nose]
已将外键移至 Nose 表。在本例中,您使用belongsTo
,因为每个Nose只能与单个Face相关。
总结
- 简单的赋值
模型模型
会创建与子项的单一、单向关系。子级没有直接的方式引用父级关系,实际上可能与多个父级模型相关。 - 双向一对一分配要求子级
属于
其父级,这还通过级联强制执行数据完整性。 - 通过将父模型配置为拥有一个 (
hasOne
) 子模型,可以创建存储在子模型上的双向一对一模型。
希望这能有所帮助。 (我仍然认为多对一术语很尴尬。)
关于grails 1.3.7 + 2.0,第 5.2.1.1 节,多对一和一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055216/