1

次の 1 対 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
    }
}

そして、null 許容プロパティ。

class Nose {
    static belongsTo = [face: Face]

    static mapping = {
        face nullable: true
    }
}

何も機能しません。機能する唯一のことは、まったく新しい顔を作成することですが、これはやりたくない. Face モデルに多くのプロパティがあり、そのうちの 1 つだけを変更したいとします。そのためには、古いプロパティをすべて新しい面にコピーしてから、変更する必要があります。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()

初めて をインスタンス化してfaceを追加するときは必要ありませんでした。これはnose、顔がまだ永続化されておらず、ゴームがカスケードで永続化できるためです。

于 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 に答える