我已经看到其他人遇到过这个问题,但我还没有找到适用于我案例的解决方案。在我的域控制器的更新方法中,我试图通过检查版本并使用rejectValue()来实现乐观锁定;但是,我显然做错了什么。我已经验证了被调用的rejectValue(),但它似乎不起作用。
此外,无论如何都会保存包含错误数据的域实例。任何建议或帮助表示赞赏。这是我的问题的更新方法:
def update(Cohort cohortInstance) {
if (cohortInstance == null) {
notFound()
return
}
cohortInstance = Cohort.get(params.id)
if (cohortInstance == null) {
notFound()
return
}
if (params.version) {
def version = params.version.toLong()
if (cohortInstance.version > version) {
cohortInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
[message(code: 'cohort.label', default: 'Cohort')] as Object[],
"Another user has updated this Cohort while you were editing")
render(view: "edit", model: [cohortInstance: cohortInstance])
return
}
}
// Bind browser data to this cohort Instance now that we've passed the concurrency check
cohortInstance.properties = params
if (cohortInstance.hasErrors()) {
respond cohortInstance.errors, view:'edit'
return
}
cohortInstance.save flush:true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.updated.message', args: [message(code: 'Cohort.label', default: 'Cohort'), cohortInstance.proposedCode])
redirect cohortInstance
}
'*'{ respond cohortInstance, [status: OK] }
}
}
答案 0 :(得分:0)
在更新方法定义(def update(Cohort cohortInstance) {}
)中,您正在初始化同类群组的实例,这是grails 2.3.x中的新功能,其中grails自动初始化实例&为你做参数绑定。
然后在第4行再次使用Cohort.get(params.id)
获取同类群组实例。所以现在你有两个选择:首先,你可以使用读取方法而不是获取并从动作签名中删除自动初始化,或者第二个是,你可以删除这一行(cohortInstance = Cohort.get(params.id)
)并在更新操作中添加交易注释,如:
import grails.transaction.Transactional
@Transactional(readOnly = true)
def update(Cohort cohortInstance) {
...
}
任何这些工作。