grails - 生成的 Controller 的更新方法中的version参数是什么

标签 grails grails-controller

我在grails中做一个示例应用程序,创建了Sponsor域类,然后生成了对应的 Controller ,该 Controller 是

class SponsorController
{
...

def更新(长ID,长版本){
def sponsorInstance = Sponsor.get(id)
if (!sponsorInstance) {
flash.message = message(code:'default.not.found.message',args:message(code:'sponsor.label',
default: 'Sponsor'),
                id
            ])
            redirect(action: "list")
            return
        }

        if (version != null) {
            if (sponsorInstance.version > version) {
                sponsorInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                        [
                            message(code: 'sponsor.label', default: 'Sponsor')] as Object[],
                        "Another user has updated this Sponsor while you were editing")
                render(view: "edit", model: [sponsorInstance: sponsorInstance])
                return
            }
        }

        sponsorInstance.properties = params

        if (!sponsorInstance.save(flush: true)) {
            render(view: "edit", model: [sponsorInstance: sponsorInstance])
            return
        }

        flash.message = message(code: 'default.updated.message', args: [
            message(code: 'sponsor.label', default: 'Sponsor'),
            sponsorInstance.id
        ])
        redirect(action: "show", id: sponsorInstance.id)
    }

当我生成一个 Controller 时,它生成了列表,显示,保存,创建,编辑和更新方法。我理解所有方法代码,但对update的方法代码有点困惑,因为它使用了两个参数id和version so my question is what is version here and what is the purpose of using version here

最佳答案

默认情况下,version被添加到每个域类,并用于实现optimistic locking。考虑以下情形

  • 用户A检索域类
  • 的实例
  • 用户B检索域类
  • 的实例
  • 用户A更新实例
  • 用户B更新实例

  • 如果我们仅允许用户B的实例持久存在,那么他将有效地覆盖A所做的更改。在某些应用程序中,这可能是可以的,但在其他应用程序中,我们可能想告诉用户B,自从他读取对象以来,该对象已更改,并且向他显示更改,而不是覆盖用户A的更新。

    版本属性是检测这种情况(称为“脏写”)的方式,即用于检查所读取对象的版本是否与数据库中当前版本相同。每次对对象进行更新时,version列都会增加。

    关于grails - 生成的 Controller 的更新方法中的version参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936369/

    相关文章:

    grails - 没有 cookie 的 HttpSession

    Grails 命令对象未绑定(bind)到 'def' 类型

    grails - 无法上传照片Grails

    spring - 处理grails中一对多关系的动态表单参数

    grails - 如何在第一个组合框(g:select)的基础上填充第二个组合框(g:select)的值?

    grails - 将控制台输出到文本字段Grails

    grails - 在特定操作后保留排序 - Grails

    Grails:addTo* 和removeFrom* 是否需要调用来保存?

    grails - Holders.grailsApplication.config 部署到 tomcat 时为空

    grails - 如何强制https