摘要类别的双向关系



我试图用抽象类定义Grails域模型。我需要定义两个抽象类,它们彼此之间有一对一的双向关系,并且无法使它们发挥作用。

基于文档的面孔示例的解释:

我实施了示例,并编写了一个按预期工作的测试:如果我设置了关系的结束,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

如果我将这两个类声明为抽象,并使用两个混凝土子类重复相同的测试(Concreteface和Concretenose没有任何属性),则第二个断言为false:testnose.face is null。

我做错了吗?如果不是,我如何在抽象域类中分解关系?

您的保存()比所需的更多,而鼻子内部的逻辑是错误的。首先, face 班级很好。让我们在这里粘贴完成:

class Face {
   static hasOne = [nose:Nose]
   static constraints = {
      nose nullable:true, unique: true
   }
}

接下来,鼻子

class Nose {
   static belongsTo = [face:Face]
   static constraints = {
   }
}

在这里请注意,一旦您拥有属于的关系,您就无法拥有 face - 父母 - 在约束部分。

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

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
}

请注意,即使不需要保存鼻子,保存 face 已经持续鼻子。您可以在 face.save()之后添加语句 nose.save()这是父母在您的桌子中很好地解决了。

做到这一点,您将自己为其中之一:

|Tests PASSED - view reports in ...

相关内容

  • 没有找到相关文章

最新更新