我正在尝试使用抽象类定义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。
我做错了吗?如果没有,我如何分解抽象域类中的关系?
答案 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 ...