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 中删除所有评论并添加共享相同 uniqueHashes 的评论。所以我调用removeAllComments(..)方法,然后调用addComments(..)方法。这会导致

Comment.uniqueHash.unique.error.uniqueHash由据称已删除的评论和添加的“新”评论引起。

我应该冲洗吗?也许我的域类有问题?

编辑问题的扩展。

也许这是一个不同的问题,但我认为会话已删除所有关联和对象。因此会话状态知道所有TalkingThread评论都已被删除。当然,这并没有反映在数据库中。我还假设新评论的“保存”是有效的,因为这种“保存”与会话状态一致。然而,这种“保存”将与数据库状态不一致。因此,我对 grails 如何验证与会话和数据库状态相关的对象的理解是有缺陷的!任何有助于理解验证与会话和数据库状态有关的保存的过程也将不胜感激。

4

1 回答 1

0

如果Comment要从 a 中删除所有 s,TalkingThread则可以使用 Hibernate 的级联行为。

添加

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

TalkingThread,然后您可以调用,comments.clear()然后thread.save()将删除关联中的评论。

这里有一篇关于 Grails 一对多关系的好文章。关于它的官方 Grails 文档在这里。

于 2012-07-31T06:39:25.403 回答