1

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

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()?

2013 年 11 月 12 日更新

以下是我想要的:

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

2 回答 2

2

在添加与现有对象的关系之前,Gorm 需要保留新对象,因此在您的情况下尝试:

Nose newNose = new Nose()
newNose.save()
face.nose = newNose
face.save()

第一次实例化 aface并添加 anose时不需要这样做,因为该面尚未持久化,而 Gorm 能够以级联方式持久化。

于 2013-11-08T14:13:16.007 回答
0

您是否尝试过:

nose.delete(flush: true, failOnError: true)
face.nose = new Nose(flush: true, failOnError: true)
face.save()

文档在这里: http: //grails.org/doc/latest/ref/Domain%20Classes/save.html

于 2013-11-08T15:01:17.523 回答