grails - 我是否需要在两个方向上分配 Grails hasOne 关系?

标签 grails grails-orm

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

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

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

编辑:

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

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

最佳答案

直接答复

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

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

在脸上。现在当你做 face.nose = nose ,setter 会为您调用,并按照您想要的方式设置关系。

一般有用的想法

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

然而,hasOne定义具有非常具体的含义。文档非常清楚地说明 hasOne 的目的是告诉 hibernate 将定义关系的键放在 child 中,在这种情况下是 Nose 。如果你仔细想想,你会意识到这种关系应该是双向的。以下是思考要点:

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

编辑 - 现在阅读我的答案,我不相信,所以我写了一个测试。我定义了 Face 和 Nose 类,如 hasOne 文档中所示,但我没有定义 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 时,您具有双向关系。

关于grails - 我是否需要在两个方向上分配 Grails hasOne 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6222116/

相关文章:

grails - heroku cleardb 插件中的连接关闭错误

grails - Grails GIS应用

inheritance - TablePerHierarchy 对于抽象类总是 false?

Grails 数据库迁移插件

hibernate - 域类是否可以配置为在保存时插入新记录而不是更新?

hibernate - LazyInitializationException每个请求有多个事务

list - 在gsps上显示列表(grails)

hibernate - GORM : List all the domain instances belonging to User (root object)

Grails 定义标准

tomcat - 使用 "grails run-war"启动 AJP 连接器