#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()
перед этим запросом (последнее средство)