отложенные обновления в транзакции в режиме гибернации создают проблему

#java #hibernate #jpa #orm

#java #спящий режим #jpa #orm

Вопрос:

В транзакции в режиме гибернации я обновляю строку (по session.update(domainObject) ), а затем выполняю select count(*) с условием where в той же таблице вместе с объединением в какой-либо другой таблице. Что я наблюдаю (через журналы), так это то, что операция обновления выполняется в конце транзакции, и, следовательно, запрос выбора, который должен выполняться после запроса обновления, показывает неверный результат. Я не могу понять, почему это происходит. Есть какие-либо выводы?

Ответ №1:

При выполнении SELECT поставщик сохраняемости определяет, следует ли ему удалять предыдущие операции CRUD, которые выполнялись ранее в той же транзакции.

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

Теоретически, когда вы делаете ВЫБОР, содержащий ссылку на объект, который был изменен в текущем сеансе, должна произойти очистка.

Возможно, вы захотите попробовать:

a) Установите режим промывки на: <property name="org.hibernate.flushMode" value="AUTO"/> . Это должно быть по умолчанию, но вы можете переопределять это. Это делается для того, чтобы:

Сеанс иногда сбрасывается перед выполнением запроса, чтобы гарантировать, что запросы никогда не возвращают устаревшее состояние.

б) Установите режим промывки на: <property name="org.hibernate.flushMode" value="ALWAYS"/> .

Будьте осторожны с этим, поскольку:

Сеанс сбрасывается перед каждым запросом.

c) Выполните руководство session.flush() перед этим запросом (последнее средство)