我有以下一对一的双向关系:
class Face {
static hasOne = [nose: Nose]
}
class Nose {
static belongsTo = [face: Face]
}
我的集成测试中也有以下内容。
void testSomething() {
Face face = new Face()
Nose nose = new Nose()
face.nose = nose
face.save()
}
有没有办法给脸部一个新的鼻子?我已经想出了尝试的想法。他们都没有工作
我试着给脸上一个新的鼻子。
face.nose = new Nose()
face.save()
但那没用。所以我想也许我必须先删除旧鼻子(防止多个鼻子属于同一张脸)。
nose.delete()
face.nose = new Nose()
face.save()
我甚至尝试过使用可更新的属性。
class Face {
static hasOne = [nose: Nose]
static mapping = {
nose updateable: true
}
}
可以为空的属性。
class Nose {
static belongsTo = [face: Face]
static mapping = {
face nullable: true
}
}
没有任何作用。唯一可行的是创造一个全新的面孔,我不愿意这样做。假设Face模型有很多属性,我想只改变其中一个属性。为了做到这一点,我必须将所有旧属性复制到新Face中,然后更改一个。为什么我不能只做face.nose = new Nose()?
更新11/12/2013
以下是我想要的:
class Face {
Nose nose
}
class Nose {
static belongsTo = [face: Face]
}
有了这个,我可以改变脸上的鼻子。有趣的是,它可以完成第一个配置也可以做的所有事情。也就是说,他们都可以进行级联保存和从头到尾的删除。
void testCascadingSavesAndDeletesFromFaceToNose() {
assert Face.count() == 0
assert Nose.count() == 0
Face face = new Face(nose: new Nose())
assert face.save() != null
assert Face.count() == 1
assert Nose.count() == 1
face.delete()
assert Face.count() == 0
assert Nose.count() == 0
}
他们也可以获得有关关系另一面的信息。
void testSimpleSave() {
Face face = new Face()
Nose nose = new Nose()
face.nose = nose
face.save()
println "face = ${face}"
println "nose = ${nose}"
println "face.nose = ${face.nose}"
println "nose.face = ${nose.face}"
}
答案 0 :(得分:2)
在添加与现有对象的关系之前,Gorm需要保持新对象的持久性,因此在您的情况下请尝试:
Nose newNose = new Nose()
newNose.save()
face.nose = newNose
face.save()
第一次实例化face
并添加nose
时不需要这样做,因为面部尚未保留,Gorm能够级联保存。
答案 1 :(得分:0)
你有没有尝试过:
nose.delete(flush: true, failOnError: true)
face.nose = new Nose(flush: true, failOnError: true)
face.save()
Doc在这里:http://grails.org/doc/latest/ref/Domain%20Classes/save.html