如何更新GORM一对一关联?

时间:2013-11-08 13:23:39

标签: grails gorm

我有以下一对一的双向关系:

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}"
}

2 个答案:

答案 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