представление mysql не обновляется внутри транзакции (Hibernate / Spring) - PullRequest
3 голосов
/ 13 марта 2012

Я использую Spring для DI и Hibernate для доступа к данным в базе данных mySQL.У меня есть код внутри транзакции, который вставляет запись в таблицу, а затем выполняет представление, которое запрашивает эту таблицу и выполняет некоторые совокупные вычисления.Проблема, которую я вижу, состоит в том, что запись, которую я только что вставил во время той же транзакции, не включена в вычисленные значения представления.Я запускаю то же представление в MySQL Workbench и вставленное значение включается в представление.Кто-нибудь знает, что вызывает это?

Ответы [ 3 ]

5 голосов
/ 13 марта 2012

В конечном итоге мне пришлось вызвать entityManager.refresh (Object entity), чтобы обновить сущность для записи представления, которую я хотел обновить.Я думаю, что проблема заключается в том, что Hibernate не может распознать, что представление необходимо обновить, поскольку он не знает, что он зависит (на уровне базы данных) от исходного объекта, который был обновлен.Я предполагаю, что Hibernate кэширует записи из представления и не знает, что они должны обновляться, даже после сброса ().

Hibernate видит исходную таблицу и представление как совершенно не связанные, когда в действительностипредставление зависит от таблицы и должно быть «грязным» при каждом изменении таблицы.Я не знаю, как заставить Hibernate признать это.

2 голосов
/ 13 марта 2012

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

1 голос
/ 13 марта 2012

Скорее всего, это вызвано уровнем изоляции MySQL по умолчанию, равным REPEATABLE READ.

Это означает, что ваша транзакция в MySQL Workbench не увидит изменений, пока вы не закончите эту транзакцию.Запуск SELECT считается транзакцией.

Вы должны увидеть изменения в MySQL Workbench, как только вы выполните там коммит (или откат).

Возможно, вы захотите изменить либо уровень изоляции по умолчанию для вашей установки на READ COMMITTED, либо изменить уровень изоляции вашего сеанса в MySQL Workbench на READ COMMITTED

Подробнее о том, как вы это делаетеможно найти в руководстве.

...