我试图用抽象类定义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 ...