12

この質問は 2 つの部分に分かれています。最初の部分はリストのクリアに関するもので、2 番目の部分は所有者をオブジェクトに割り当てることに関するものです。

Grails のモデル内の 2 つのドメイン オブジェクト間に 1 対多の関係があります。関係はこんな感じ…

class Person {

    static hasMany = [authorities: Role, locations: Location]
}

class Location {

    static belongsTo = Person

}

私のアプリでは、locationsリストPersonが完全に更新され、ユーザー アクションの新しいリストに置き換えられます。Locationさらに、関連付けられているオブジェクトとは関係なく、オブジェクトのリストを取得しますPerson。現在ログインしているユーザーを取得することで、それらを適用する人を解決します。これは、私が呼び出したものactivePersonであり、私の目的には問題ありません。

私がやりたいことは、既存の場所をすべて削除し、新しい場所をactivePersonすべて挿入して、それらを に関連付けるactivePersonことです。Personこの時点で保持したくないプロパティがたくさんあるので、子の場所が変更されたという理由だけで親オブジェクト全体を保存することは避けたいと思います。

リストを反復処理activePerson.locationsして 1 つずつ削除し、GORM/Hibernate に依存してクエリをまとめてバッチ処理し、最後にフラッシュすることを考えました。これは力ずくのように思えますが、うまくいくかもしれません。メソッドか何か似たようなものがあるclearLocationsと思っていたのですが、見つかりません。

を新しいリストに置き換えてactivePerson.locationsを呼び出すとactivePerson.save(flush:true)、GORM は既存の行の削除を処理しますか?

次に、新しいLocationオブジェクトを に配置しactivePersonます。もう一度入力しactivePerson.locationsて全体を保存することはできますが、できればそれは避けたいと思います。belongsToそれらを個別に保存することはできますが、各Locationオブジェクトを設定するにはどうすればよいですか?

要約すると:

  1. 1 対多のコレクションの多側にあるリストをクリアするにはどうすればよいですか?
  2. 独立したオブジェクトを親オブジェクトに関連付けて個別に永続化するにはどうすればよいですか?

ありがとう

4

4 に答える 4

10

クリアリングCollectionアプローチはうまくいきませんでした:

activePerson.locations.clear()

ConcurrentModificationExceptionを呼び出して回避しながら、コレクションを反復処理してみてくださいcollect():

activePerson.locations.collect().each {
    item.removeFromLocations(it)
}

その後、エンティティを保存して SQL ステートメントを実行します。

activePerson.save flush:true

詳細を読むための記事へのリンク: http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/

于 2013-10-27T03:18:05.643 に答える
9

#1の場合、コレクションをクリアできます(デフォルトではセットです):

activePerson.locations.clear()

#2 の場合、addToLocations を使用します。

activePerson.addToLocations(location)

人物を保存すると、場所 <-> 人物の関係が更新されます。

于 2010-01-15T17:24:07.177 に答える