Изменение объекта в AfterInsert/AfterUpdate

У меня есть объект домена, который содержит результаты вычислений на основе параметров, являющихся свойствами того же объекта домена. Я хотел бы убедиться, что каждый раз, когда параметры изменяются пользователем, он пересчитывается и правильно сохраняется в базе данных.

Я пытаюсь сделать это с помощью afterInsert (чтобы в первую очередь убедиться, что расчет правильный) и afterUpdate.

Однако, поскольку мой расчет пытается изменить сам объект, он не работает - выдает различные исключения спящего режима.

Я попытался поместить код afterUpdate в транзакцию, но это не помогло. Я боюсь, что здесь у меня возникают проблемы с циклической зависимостью.

Исключение, которое я получаю прямо сейчас:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27]

События GORM предназначены для более простых вариантов использования? Я склонен заключить, что изменение объекта, который вы сохраняете в процессе сохранения, — не лучший выход.


person Jean Barmash    schedule 04.03.2010    source источник
comment
каков ваш обходной путь с этой проблемой. Я тоже стою перед этой дилеммой. .withNewSession не работает для afterInsert. Я не могу сбросить объект или просто сохранить его (ну, я могу .save(), но кажется, что вычисления, которые я сделал внутри afterInsert, не сохраняются в базе данных, если я просто использую .save() ). Спасибо! В любом случае, я просто хочу сохранить объект пользователя внутри моего доменного класса (например, сообщение), который его создал. Поскольку контрольный след просто сохраняет только длинную ссылку (например, createdby), я не могу в конечном итоге манипулировать классом домена сообщения и в конечном итоге ссылаться на его атрибут   -  person    schedule 02.06.2010


Ответы (2)


Вы используете 1.2.0+?

Если да, вы можете использовать .withNewSession в закрытии событий, что должно избежать хаоса в спящем режиме.

ваше здоровье

Ли

person leebutts    schedule 05.03.2010
comment
да, я на 1.2.1. Я пытался использовать withNewSession, но это не помогло, что привело к странным ошибкам гибернации. - person Jean Barmash; 05.03.2010

Есть ли причины против использования beforeInsert и beforeUpdate вместо afterInsert и afterUpdate?

Если нет, переключение на обработчики событий before* должно решить вашу проблему.

person fabien7474    schedule 05.03.2010
comment
Я думал, что к моменту срабатывания afterInsert объект почти сохраняется и к этому моменту имеет идентификатор, но я могу ошибаться - весь процесс сохранения (с событиями), похоже, плохо документирован. - person Jean Barmash; 05.03.2010
comment
Действительно, если в ваших вычислениях используется свойство id, может возникнуть проблема с размещением вашего кода в обработчиках before*. И я не знаю, какое событие запускается при создании идентификатора. - person fabien7474; 05.03.2010