我有以下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)
}
有没有办法让这项工作?
答案 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)