Grails, AJAX - строка была обновлена ​​или удалена другой транзакцией

У меня есть очень простая 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()
    }
}

0 ответов

Другие вопросы по тегам