我有一个非常简单的 gsp 页面,其中包含对象列表,并且可以通过单击一行来编辑每个对象。单击一行后,我通过 AJAX 调用获取相应的数据,并在表格下方的一些文本字段中显示详细信息。
然后我单击“更新”按钮,导致另一个 AJAX POST 请求将数据发送到相应的控制器,如下所示:
def update(Role roleInstance) {
if (roleInstance == null) {
notFound()
return
}
if (roleInstance.hasErrors()) {
response.status = 420
render template: "editForm", model: [roleInstance: roleInstance]
return
}
roleService.update(roleInstance)
flash.message = message(code: 'default.updated.message', args: [message(code: 'aedb.role.label'), roleInstance.authority])
render template: "roleTable", model: [roleInstanceList:Role.list()]
}
一切似乎都很好 - 域对象在数据库中正确更新。
只有一件事我不明白:每次我单击表中的一行以获取数据时,更改某些内容,然后单击更新按钮,我得到StaleObjectStateException
. 如果再次单击更新按钮,则更新成功,没有问题。
目前,我正在使用save
RoleService 的方法保存对象。在此之前,我尝试使用roleInstance.save flush:true
. 但是,当我对同一个对象进行两次更新时,我得到了同样的错误。
编辑:
edit
按照我的行动来源RoleController
:
def edit(Role roleInstance) {
if (roleInstance == null) {
notFound()
return
}
def notAssignedPermissions = Permission.list() - roleInstance.getPermissions()
render template: "editForm", model: [roleInstance: roleInstance, notAssignedPermissions: notAssignedPermissions]
}
就我RoleService
而言,这是一个非常简单的类:
@Transactional
class RoleService {
@Transactional(readOnly = true)
def getRole(id) {
Role.get(id)
}
@Transactional
def update(role) {
role.save()
}
}