перехватчик гибернации для проверки дизайна журнала из-за разницы во времени при вызове onSave и afterTransactionComplete

Что я делаю

У меня есть система async, которая реагирует всякий раз, когда в системе main создается новый объект, и эта система async запрашивает базу данных для вновь созданных объектов.


Как я это делаю

Для создания сообщений для системы async я использую hibernate interceptor.

Поэтому всякий раз, когда создается новый объект, вызывается метод onSave перехватчика, и я

сохранить идентификатор объекта в list, и теперь, когда afterTransactionComplete(Transaction tx)

вызвал, я очищаю все entity id в системе от list до async, используя систему обмена сообщениями (ActiveMq).


В чем проблема

Теперь problem возникает, когда в процессе находится более одной транзакции.. и обе

транзакции создают сущности.

Позвольте мне привести пример:

Tx_A создать объект EA1, EA2.

Tx_B создает сущность EB1, EB2.

Теперь предположим, что поток выполнения происходит следующим образом:

[1] при сохранении для EA1 я добавляю идентификатор EA1 в flushList

[2] при сохранении для EB1 я добавляю идентификатор EB1 в flushList

[3] afterTransactionComplete(tx) для Tx_A

Теперь в этот момент я сброшу EA1 and EB1 id в async систему, которая при запросе базы данных

для EB1 найдено нулевое значение, так как транзакция Tx_B еще не завершена.


Теперь эту проблему можно решить, если в вызове onsave я могу получить идентификатор транзакции, а затем в afterTransactionCompletion я могу сбросить только объект, связанный с этой транзакцией.

[1] Теперь есть ли способ получить идентификатор этой транзакции?

[2] Есть ли другое решение вышеуказанной проблемы?

я использую спящий режим 4.2.2


person Bhuvan    schedule 29.03.2014    source источник


Ответы (1)


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

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

person Bhuvan    schedule 01.04.2014