grails抽象类中的双向关系

时间:2015-05-11 13:45:28

标签: grails abstract-class bidirectional-relation

我正在尝试使用抽象类定义Grails域模型。我需要定义两个抽象类,它们彼此之间具有一对一的双向关系,并且不能使它们起作用。

基于Face-Nose文档示例的说明:

我实现了这个示例并编写了一个按预期工作的测试:如果我设置了关系的结束,grails会设置另一端。

class Face {
    static hasOne = [nose:Nose]

    static constraints = {
        nose nullable: true, unique:true
    }
}

class Nose {
    Face face
    static belongsTo = [Face]

    static constraints = {
        face nullable:true
    }
}


    when:'set a nose on the face'
        def testFace = new Face().save()
        def testNose = new Nose().save()

        testFace.nose = testNose
        testFace.save()

    then: 'bidirectional relationship'
        testFace.nose == testNose
        testNose.face == testFace

如果我将这两个类声明为abstract并使用两个具体子类(ConcreteFace和ConcreteNose没有任何属性)重复相同的测试,则第二个断言为false:testNose.face为null。

我做错了吗?如果没有,我如何分解抽象域类中的关系?

1 个答案:

答案 0 :(得分:0)

你有比所需更多的save(),而且Nose内部的逻辑是错误的。首先, Face 类是好的;让我们粘贴完成:

class Face {

   static hasOne = [nose:Nose]

   static constraints = {
      nose nullable:true, unique: true
   }
}

接下来, Nose

class Nose {

   static belongsTo = [face:Face]

   static constraints = {
   }
}

请注意,一旦您拥有 belongsTo 关系,您就无法拥有 face - 父级 - 可以为空约束部分。

最后,您的集成测试。确保它是集成测试,而不仅仅是单元测试。当您测试与数据库相关的逻辑(CRUD操作)时,需要进行集成测试,而不仅仅是模拟单元测试所做的操作。这里:

def "test bidirectionality integration"() {
   given: "a fresh face and nose"
   def face = new Face()
   def nose = new Nose(face:face)
   face.setNose(nose)

   when: "the fresh organs are saved"
   face.save()

   then: "bidirectionality is achieved"
   face.nose == nose
   nose.face == face
}

请注意,即使不需要保存 nose ,保存 face 也会保留 nose 。您可以在 face.save()之后添加语句 nose.save(),它不会在此处提供任何内容,但之前不会提供 - 您无法保存孩子在它的父母很好地安顿在你的桌子前。

这样做,你就会得到其中一个:

|Tests PASSED - view reports in ...