0

我已经看到其他人遇到过这个问题,但我还没有找到适合我的解决方案。在我的域控制器的更新方法中,我试图通过检查版本和使用拒绝值()来实现乐观锁定;但是,我显然做错了什么。我已经验证正在调用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] }
    }
}
4

1 回答 1

0

在您的更新方法定义 ( def update(Cohort cohortInstance) {}) 中,您正在初始化Cohort的实例,这是 grails 2.3.x 中的一个新特性,其中 grails 会自动初始化实例并为您执行参数绑定。

然后再次在第4行,您将使用Cohort.get(params.id). 因此,现在您有两个选择:首先,您可以使用read方法而不是get并从动作签名中删除自动初始化,或者第二个是,您可以删除此行 ( cohortInstance = Cohort.get(params.id)) 并在更新动作中添加事务注释,例如:

import grails.transaction.Transactional

@Transactional(readOnly = true)
def update(Cohort cohortInstance) {
  ...
}

这些工作中的任何一个。

于 2014-07-02T09:46:12.843 回答