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