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()
}
}