Hibernate PostInsertEventListeners - Использовать ту же транзакцию, что и вставка? - PullRequest
5 голосов
/ 04 марта 2010

У меня есть некоторый код гибернации, который выполняет вставку в базу данных, и по завершении этой вставки запускается настроенный PostInsertEventListener. (По сути, триггер, обеспечивающий надлежащее обновление других записей)

Что мне нужно сделать, так это заставить код внутри EventListener использовать ту же транзакцию, что и исходная вставка, так что если вставка не будет успешно зафиксирована, EventListener не сработает.

Я слышал, что вы можете использовать javax.transaction.Syncronization и методы transaction.registerSyncronization() Hibernate, чтобы сделать это, но я не могу найти ни одного примера использования.

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 11 марта 2010

Я не думаю, что это возможно.

Если я понимаю, вы хотите выполнить какой-то код, только если транзакция успешно завершена (была подтверждена).Однако, если транзакция зафиксирована, вы не можете сделать что-то еще в той же транзакции, так как она завершена.

Однако вы можете использовать PreInsertEventListener, который вызывается внутри транзакции (перед фиксацией).Слушатель события будет запускать событие, если транзакция не удалась (поскольку мы не знаем до фиксации, если транзакция будет успешной), но все, что вы измените в слушателе, не будет сохранено в базе данных, если транзакция потерпит неудачу.Проверьте список прослушивателей https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html.

Одно предупреждение.Вы не должны делать слишком много изменений данных в слушателе.Особенно не следует запускать ленивую загрузку коллекций.

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