2012-04-26 8 views
2

grailの1対多ドメイン関連オブジェクトを保存するベストプラクティスは何ですか?シナリオを考えてみましょう。grailsの1対多ドメイン関連オブジェクトを保存するベストプラクティスは何ですか?

AとBの2つのクラスとA hasMany BリレーションとB belongsTo Aがある場合、Bドメインオブジェクトの作成/保存/削除のベストプラクティスは何ですか?多くの場合、Bオブジェクトを作成できませんAsが作成されたとき。

おかげ

答えて

4

ように作成されたときにBのオブジェクトを作成するために、そのことはできません。

私はそれが本当ではないと確信しています。 GrailsはHibernateを使用し、Hibernateは基本的にカスケード設定である推移的永続性という概念を持っています。デフォルトではGrailsのカスケード設定はsave-updateです。つまり、新しい親と新しい子を作成して親に追加すると、親を保存するときに子を保存する必要があります。

"ベストプラクティス"はありません。休止状態での永続セマンティクスを完全に理解する必要があり、あなたに合った構成を選択しました。あなたは子供たちに自分のライフサイクルを持たせたいのですか?どの操作をカスケードしたいですか?あなたはその関係を双方向にするかどうか、関係がどのようになるべきか?優れたドメイン層を開発するには、これらの質問(およびそのような質問など)を理解し、必要な機能に応じて回答の意味を理解する必要があります。

0

私はあなたが正確に求めているものの非常にわからないんだけど、あなたは同様とBSの両方をインスタンス化して保存する方法を求めているならば、私はこのようにそれを行うだろう:

class B { 
    String name 
    static belongsTo=[a:A] 
} 

class A { 
    static hasMany=[manyBs:B] 
} 

その後:

def a=new A() 
a.addToManyBs(name:'someB') 
a.save() 
0

所有者とペットというオブジェクトを呼び出してみましょう。ペットを持たないオーナーオブジェクトを初期化して保存します。ペットを同時に作成する必要はありません。

Owner owner = new Owner(pets: []).save() 

これで、ペットをオーナーに追加できます。

owner.pets.add(new Pet(name: "fido")) 

それとも、我々はペットのコレクションを使用することができます:我々は、単一のペットと一緒にそれを行うことができOwnerオブジェクトを保存することにより

def petCollection = [ 
    new Pet(name: "Pete"), 
    new Pet(name: "meow") 
] 
owner.pets.addAll(petCollection) 
owner.save() 

を、新しく作成したペットのオブジェクトでもあることがわかります持続した。

0

ドメインの制約部分ではnullをtrueにする必要があります。 つまり静的な制約{ nullable:true }

関連する問題