次のドメイン クラスがあります (短縮版)
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 がセッションとデータベースの状態に関連してオブジェクトを検証する方法についての私の理解には欠陥があります! セッションおよびデータベースの状態に関して保存を検証するプロセスを理解する上での助けもいただければ幸いです。