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

grails 1.3.7+;2.0,第5.2.1.1节,多对一和一对一,grails,grails-domain-class,Grails,Grails Domain Class,示例A-C似乎有点混乱: 示例B:这是否仍然是一种多对一关系,如示例a(即相同的表设置)?最后它说,“要实现真正的一对一,使用hasOne属性…” 示例C:使用hasOne时,是否应停止使用belongsTo?这是暗示吗 为什么它们在示例C中显示了两种变体?第一个容易出问题吗 我试图理解所有有效的多对一和一对一组合 谢谢我同意他们的术语在这里有点混乱。但我会尽力帮助你: 多对一(A) 这里他们指的是父对象指向单个子对象的关系。但是,子对象不知道父关系。我相信,他们之所以称之为多对一,是因为没有实

示例A-C似乎有点混乱:

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

示例C:使用hasOne时,是否应停止使用belongsTo?这是暗示吗

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

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


谢谢

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

多对一(A) 这里他们指的是父对象指向单个子对象的关系。但是,子对象不知道父关系。我相信,他们之所以称之为多对一,是因为没有实施唯一的一对一映射。从技术上讲,只需将同一鼻子保存到关系中,就可以在多张脸上使用同一鼻子。而且,如果删除一个面,鼻子将继续存在,只是没有一个面。(写这个越来越奇怪了!)

存储在父表上的一对一(B) 在第二个示例中,他们添加了
belongsTo
,以实现一对一的关系。这意味着鼻子的存在取决于脸的存在。所以,现在这是一种真正的一对一关系。由于配置方式的原因,此关系的外键存储在Face表中(请参阅下一节)

一对一存储在子表(C)上 在最后一个例子中,仍然是一对一。但是,将简单的
Nose-Nose
更改为
static hasOne=[Nose:Nose]
已将外键移到Nose表中。在这种情况下,您可以使用
belongsTo
,因为每个鼻子只能与一个面相关

总之
  • 一个简单的赋值
    模型
    创建了一个与子对象的单向关系。子对象无法直接引用父对象关系,事实上,可能与多个父对象模型相关
  • 双向一对一分配要求子对象隶属于父对象,这也通过级联加强了数据完整性
  • 通过将父对象配置为具有一个(
    hasOne
    )子模型,可以创建存储在子对象上的双向一对一

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

谢谢您的热情回复。我希望大家支持我的意见。在例B中:你认为他们为什么会在例B的末尾做出这样的陈述,即“使关系成为真正的一对一”?在Ex C中,为什么不同时使用hasOne和belongsTo来创建一个组合呢?我认为B仍然是一个多对1的组合,但是现在有了用于保存和删除的级联。然而,我们可以用这个射自己的脚,就好像有X类和Y类,x1引用y1,x2引用y1。然后删除x1会删除y1,所以x2会“有麻烦”(因为y1不见了)。听起来你比我想得好一点!不太热心——我仍然很困惑,我很欣赏你的想法,这些想法很有帮助。我将发布一个问题,关于hasOne和belongsTo是否应该一起使用。呃——我又花了一个小时阅读了这篇文章,以找出Grails文档中出现的明显不一致之处,也就是说,在我们正在讨论的部分中,例C中1)是这样说的“此属性将外键放在上一个示例中的逆表上”,以及2)中的最后一个代码段,以及关于如何创建反向引用的讨论。示例B使用“static belongsTo=[face:face],belongsTo文档称这将创建反向引用。