我在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。考虑以下情形
如果我们仅允许用户B的实例持久存在,那么他将有效地覆盖A所做的更改。在某些应用程序中,这可能是可以的,但在其他应用程序中,我们可能想告诉用户B,自从他读取对象以来,该对象已更改,并且向他显示更改,而不是覆盖用户A的更新。
版本属性是检测这种情况(称为“脏写”)的方式,即用于检查所读取对象的版本是否与数据库中当前版本相同。每次对对象进行更新时,version列都会增加。
关于grails - 生成的 Controller 的更新方法中的version参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936369/