2

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

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

ありがとう

4

4 に答える 4

4

As の作成時に B オブジェクトを作成することはできません。

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

「ベストプラクティス」はありません。hibernate での永続化のセマンティクスを完全に理解し、適切な構成を選択する必要があります。子供たちに自分のライフサイクルを持たせたいですか?カスケードする操作はどれですか? リレーションシップを双方向にするかどうか、またリレーションシップをどちらに向けるべきか? 優れたドメイン層を開発するには、これらの質問 (および同様の質問) と、必要な機能に対する回答の意味を理解する必要があります。

于 2012-04-26T13:29:48.140 に答える
0

正確に何を求めているのかよくわかりませんが、AsとBの両方をインスタンス化して保存する方法を求めている場合は、次のようにします。

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

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

それで:

def a=new A()
a.addToManyBs(name:'someB')
a.save()
于 2012-04-26T13:31:08.570 に答える
0

ドメインの制約部分で nullable true を指定する必要があります。つまり、静的制約{ a nullable: true }

于 2012-04-27T12:58:16.167 に答える
0

オブジェクトを Owner と Pet と呼びましょう。ペットを持たない所有者オブジェクトを初期化し、先に進んで保存します。これは、ペットを同時に作成する必要がないことを示すためです。

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

これで、所有者にペットを追加できます。1 匹のペットでそれを行うことができます。

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

または、ペットのコレクションを使用できます。

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

Owner オブジェクトを保存すると、新しく作成された Pet オブジェクトも永続化されていることがわかります。

于 2012-04-26T13:37:46.553 に答える