2010-11-30 4 views
1

関連するエンティティを削除し、この変更をデータベースに保存しておくと問題が発生します。grails/GORM/hibernate - 親のsave()でhasManyマップが同期していない

groovyオブジェクトには、多くの場合、エンティティが関連付けられています。このドメインオブジェクトを見つけてこのリストをnullに設定し、 .save(flush:true)を呼び出すと、 の要素がデータベースに残ります。これらが削除されていると思われたでしょうか。どんな提案も素晴らしいだろう。我々は要素を追加および削除

class Child {

belongsTo = [Parent] ... }

 
def child = new Child()

def parent = new Parent(child:child)

parent.save(flush:true) def id = parent.id //from saved entity

/// in separate transaction

parent = Parent.get(id) //id from above parent.child = null

parent.save(flush:true)

// check database - child reference still there - expect to have been deleted

我々は間違って何をやったかについての任意の提案は次のようになり

class Parent {

static hasMany = [child:Child] ... }

と子感謝。 grails 1.3.5(最新版)を使用しています。

答えて

4

最初のものをチェックアウト、あなたはchild.delete(フラッシュ:true)を使用する必要があります代わりにアサインヌルの。それはちょうど適当ではない。 (以前の間違いの申し訳ありません)

私はあなたがピーター・レッドブルックシリーズ:http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/を読むことをお勧めします。それでも上記の記事(特に有用)読んでいない場合には:子を削除するには

を、あなたはまず、親コレクションから削除する必要があなたのケースでは、「子どもの削除」を

アップデートを検索消して。しかし、belongsTo関係を使用しているため、ヌル例外ではないプロパティが発生します。

ソリューション:あなたは親クラスにこれを追加することができます。

static mapping = { 
childs cascade: "all-delete-orphan" 
} 

上記のマッピングは、親を持たないすべての子を削除するのに役立ちます。そして、あなたは、これが正常に動作

parent.childs.clear() 
+1

非常に良い答えです。ブログを読む - それはそれの価値がある! – sbglasius

+0

あなたの解決策は基本的に私が言ったことです、ちょうど私はそれをあきらめていませんでした。私は彼に関連文書を指摘した。男に魚を与えて、彼は一日食べ、男に魚を教える、彼は生涯食べる。... – hvgotcodes

+0

これらのコメントありがとう;私はこれを働かせることができず、この段階では調査のための時間予算を持っていません。カスケード「all-delete-orphan」と「all、delete-orphan」を設定しようとしました。また、各エントリを削除し、clearを呼び出して新しい行を追加しようとしましたが、staleObject例外を保存しました。私がもう一度調査すれば、logSqlを使って休止状態がどのように動作しているかを理解し、設定をデバッグすることができますが、それは待たなければなりません。ご回答いただきありがとうございます。 – Alex

0
static mapping = 
{ 
    childs cascade: "all" 
} 

を使用することができます。

関連する問題