grails 1.3.7 + 2.0,第 5.2.1.1 节,多对一和一对一

标签 grails grails-domain-class

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/

相关文章:

grails - grails 3-获取子域对象

Grails 图像处理

grails - 将用户定义属性添加到域类

grails - 如何将inList约束添加到不同类的变量中?

grails - Grails-多对多搜索

ajax - 需要有关使用 Grails 和 Ajax 附加到像 Rails 中的 div 的建议

ajax - 如何在 Grails 和 AngularJS 上使用 Spring Security 进行 Ajax 登录

grails - 如何在Grails中使用 “if”语句使用findAll在搜索之前验证字段是否为空

unit-testing - Grails:模拟休眠域操作-beforeInsert

Grails 域类构造函数使用 id 而不是对象