Почему domainObject.discard () не работает в службе @Transactional в Grails? - PullRequest
0 голосов
/ 16 февраля 2012

В моем сервисе есть метод с аннотацией @Transactional. Внутри я делаю разные вещи с двумя объектами, и в конце я хочу .discard() изменить один из них, чтобы он не сохранялся в этой транзакции. Что я делаю, так это отправляю информацию об object2 в мою очередь ActiveMQ, где ее получает слушатель, там проделывается некоторая работа, и в конце она сохраняется в другой транзакции. Объект 1 должен сохраняться как обычно.

Это, однако, не работает. То, что происходит, - то, что слушатель в моей очереди может .get() объект, выполнить некоторые изменения на нем и .save(), прежде чем первая транзакция закончена. Благодаря этому я получаю org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect).

Я выполняю .get() объектов внутри сервиса. Транзакция сохраняется при выходе из сервиса и возвращении к контроллеру.

Что мне нужно сделать, чтобы Grails не сохранил object2 в основной транзакции?

1 Ответ

0 голосов
/ 17 февраля 2012

Вы можете попробовать .refresh() на объекте 2 до конца вашего метода обслуживания. Это перезагрузит и перезапишет любые данные в object2 обновленными данными в вашей базе данных, так что переменная оптимистической блокировки version совпадает (что, я думаю, является причиной вашей Exception). И Hibernate не нужно очищать объект, так как он теперь соответствует базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...