我有一个非常简单的gsp-Page,其中包含一个对象列表,并且可以通过单击一行来编辑每个对象。点击一行后,我通过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
。如果再次单击更新按钮,则更新成功没有问题。
目前,我正在使用RoleService的save
方法保存对象。在此之前,我尝试使用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()
}
}