Grails,AJAX - Row已被其他交易更新或删除

时间:2015-11-19 15:29:02

标签: ajax grails staleobjectstateexception

我有一个非常简单的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()
    }
}

0 个答案:

没有答案