在Grails Controller中更新HasMany关系

时间:2015-01-19 13:43:18

标签: grails grails-2.0

我有以下grails域类:

A {
 belongsTo = [b: B]
}

B {
 hasMany = [aClasses: A]
}

在GSP视图中,我有一个表单,用户可以选择多个A实例将它们与B实例连接。当用户提交表单时,处理表单的Controller会收到如下内容:

params: [aClasses: [123,124]]

用户可能已经从B中删除了之前添加的aClasses,因此我首先尝试清除a的B类,然后执行addTo,但我得到了java.util.ConcurrentModificationException

以下是我在Controller Action中的操作:

def update() {
B b = B.get(params.id)
b.properties = params
b.aClasses.clear()

def newAs = params.aClassIds ? [] + params.aClasses : []
newAs.each {
 A a = A.get(it)
 b.addToAClasses(a)
}
b.save(flush: true)

}

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:0)

这是在服务或控制器中运行吗?我之前做过类似的事情,但逻辑是在服务中并且有效。这种数据库访问应该在服务中运行,因为它们是事务性的。

有效的例子是:

    if(!clone.hasErrors())
    {
        def projectTasks = Task.withCriteria {
            project {
              eq('id', project_id.toInteger())
            }
          }
        projectTasks.each{ task -> 
            clone.addToTasks(task)
        }
    }

    clone.save(flush : true)