【问题标题】:Do I need to assign a Grails hasOne relationship in both directions?我需要在两个方向上分配 Grails hasOne 关系吗?
【发布时间】:2011-06-03 01:30:03
【问题描述】:

我必须在每个方向上分配关系吗?使用textbook domain classes for the hasOne relationship,从我目前的测试来看,这似乎有必要让实例相互识别:

def face = new Face()
def nose = new Nose()
face.nose = nose
nose.face = face

不过,我不知道为什么。这是非常尴尬的。我期待有更好的方法。

编辑:

我需要关于关系任务的帮助。我不需要有关在域类中设置 hasOne 关系的机制的信息,也不需要讨论双向引用的智慧。我想知道为什么设置鼻子实例和面部实例之间的关系需要不止一个单个语句。

我的双语句解决方案基于我在复杂应用程序中遇到的问题。我将尝试在一个简单的例子中重现我的经验。

【问题讨论】:

  • 如果你澄清哪个部分是“尴尬”,我可以扩展我的答案
  • 需要两个任务来完成工作是很尴尬的。将其与 face.addToEars(leftear) 进行比较,它不需要我也分配 leftear.face = face。

标签: grails grails-orm


【解决方案1】:

直接回答

需要建立关系,即分配鼻子到脸和脸到节点,并不是很尴尬。 Hibernate 是一个 RELATIONSHIP 映射器,因此您需要明确关系。也就是说,您可以通过定义一个

setNose(nose){
   this.nose = nose
   nose.face = this
}

在脸上。现在,当您执行 face.nose = nose 时,将为您调用 setter,并且按照您想要的方式设置关系。

一般有用的想法

通常,您不需要在两个方向上分配关系。 单向双向关系是完全有效的。

但是,hasOne 定义具有非常具体的含义。文档非常清楚地说明了 hasOne 的目的是告诉 hibernate 将定义关系的键放在孩子中,在这种情况下是鼻子。如果您仔细考虑一下,您会意识到这种关系应该是双向的。以下是思考点:

1) 您在 Face(即父级)上定义 hasOne。
2) 即使您在父级上定义了 hasOne,但受影响的基础表是子级表(即 Nose 上的 face_id 列)
3)由于外键在孩子身上,孩子必须有对其父母的引用。如果没有,您将在子项上拥有一个属性,该属性是外键但与对象无关。
4) 请记住,您正在使用 ORM 的机制来定义关系。虽然您可以手动将 face_id 字段添加到 Nose,并在代码中设置值(即自己管理关系,而不是让 ORM 工具来做),但您明确使用 ORM 的事实意味着 ORM 工具将管理关系给你。

编辑——现在阅读我的答案,我不相信,所以我写了一个测试。我在 hasOne 文档中定义了 Face 和 Nose 类,但我没有定义 Face on the Nose。我试图让它单向。我写了一个测试看看会发生什么。这是测试

class FaceTests extends GroovyTestCase {

    public void testStuff(){
        Face face = new Face()
        Nose nose = new Nose()

        face.nose = nose;
        face.save(flush:true)

        assertNotNull face.id
        assertNotNull nose.id
    }

}

结果是一个异常,包含

hasOne property [Face.nose] is not bidirectional. Specify the other side of the relationship!

所以框架甚至可以确保,当你使用 hasOne 时,你有一个双向关系。

【讨论】:

  • 感谢您最近对此答案的补充。如果您仅通过 setNose() 讨论添加第二个答案,我会接受。这样,答案将直接说明我当前状态下的问题。
  • @jim 我认为保留一个答案是更好的 SO 程序。但是我重新格式化并重新排列了要点的答案是首先并标记为这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2017-04-21
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多