1

次のドメイン クラスがあります (短縮版)

class TalkingThread {

    static hasMany = [comments:Comment]
    Set comments = []
    Long uniqueHash 
}

class Comment {
    static belongsTo = [talkingThread:TalkingThread]
    static hasOne = [author:CommentAuthor]
    Long uniqueHash

    static constraints = {
        uniqueHash(unique:true)
    }
}

class CommentAuthor {
    static hasMany = [comments:Comment]
    Long hash
    String name
    String webpage
}

以下の方法

public TalkingThread removeAllComments(TalkingThread thread){
    def commentsBuf = []
    commentsBuf += thread.comments
    commentsBuf.each{
        it.author.removeFromComments(it)
        thread.removeFromComments(it)
        it.delete()
    }
    if(!thread.save()){
        thread.errors.allErrors.each{
            println it
        }
        throw new RuntimeException("removeAllComments")
    }
    return post
}

public addComments(TalkingThread thread, def commentDetails){
    commentDetails.each{
        def comment = contructComment(it,thread)
        if(!comment.save()){
            comment.errors.allErrors.each{ println it}
            throw new RuntimeException("addComments")
         }
         thread.addToComments(comment)
    }
    return thread
}

TalkingThread からすべてのコメントを削除し、同じ uniqueHash を共有するコメントを追加する必要がある場合があります。そこで、removeAllComments(..)メソッドを呼び出してから、addComments(..)メソッドを呼び出します。これにより、

Comment.uniqueHash.unique.error.uniqueHashは、おそらく削除されたコメントと「新しい」コメントが追加されたことが原因です。

私はフラッシュする必要がありますか?私のドメインクラスに何か問題があるのでしょうか?

質問の拡張を編集します。

これは別の質問かもしれませんが、セッションがすべての関連付けとオブジェクトを削除したと思いました。したがって、セッション状態は、すべてのTalkingThreadコメントが削除されたことを認識しています。もちろん、これはデータベースに反映されていません。また、そのような「保存」がセッション状態と一致していることを考えると、新しいコメントの「保存」は有効であると想定しました。ただし、そのような「保存」はデータベースの状態と矛盾します。したがって、grails がセッションとデータベースの状態に関連してオブジェクトを検証する方法についての私の理解には欠陥があります! セッションおよびデータベースの状態に関して保存を検証するプロセスを理解する上での助けもいただければ幸いです。

4

1 に答える 1

0

Commentaからすべての sを削除したい場合は、TalkingThreadHibernate のカスケード動作を使用できます。

追加

static mapping = {
        comments cascade: 'all-delete-orphan'
    }

toTalkingThreadを呼び出しcomments.clear()てから、これを呼び出すthread.save()と、関連付けにあったコメントが削除されます。

Grails の 1 対多の関係に関する優れた記事がここにあります。Grailsの公式ドキュメントはこちらです。

于 2012-07-31T06:39:25.403 に答える