生成的控制器的更新方法中的版本参数是什么

时间:2014-07-24 14:23:26

标签: grails grails-controller

我在grails中做一个示例应用程序我创建了一个Sponsor域类,然后我生成了相应的控制器

class SponsorController
{
...

def update(Long id,Long version){

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)
    }

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

1 个答案:

答案 0 :(得分:2)

默认情况下,

version会添加到每个域类,并用于实现optimistic locking。请考虑以下情况

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

如果我们只是允许用户B的实例持续存在,他将有效地覆盖A所做的更改。在某些应用程序中,这可能没问题,但在其他应用程序中,我们可能希望告诉用户B对象自阅读以来已经改变,并向他显示更改而不是覆盖用户A的更新。

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