Очистка сеанса, сброс, обновление после массовых обновлений в спящем режиме? - PullRequest
8 голосов
/ 13 октября 2011

Как мы знаем, при массовом обновлении базы данных с помощью гибернации (даже в HQL) сделанные изменения не реплицируются на объекты, сохраненные в текущем сеансе.

Так что я могу вызвать session.refresh для загрузки изменений в мои сущности сеанса.

Мы часто вызываем flush для отправки наших модификаций в БД, но в документации говорится, что он "синхронизирует" сеанс и базу данных ...

Означает ли это, что flush сможет установить хорошее новое значение db для моей сущности сеанса? Или flush в конечном итоге сотрет мое новое значение в БД со старым, сохраненным в сущности? (Кстати, если поведение hibernate является первым, как оно определяет, какое из них является «хорошим значением»?).

Если я не могу использовать flush в таком случае, рекомендуется очищать сеанс после каждого массового обновления, чтобы в нашем сеансе были хорошие значения?

1 Ответ

8 голосов
/ 14 октября 2011

Все, что flush сделает, это отправит ранее кэшированные операторы SQL в базу данных. Это не изменит ваши объекты, которые уже находятся в сессии. В каком-то смысле это противоположно тому, что вам нужно. Операторы SQL из flush могут потенциально переопределить ваши изменения массового обновления. Что вы, вероятно, хотите сделать, это flush(), а затем clear() до вашего обновления. Или, если вы не хотите очищать весь кеш, evict(). Я никогда не пробовал refresh(), но, похоже, это тоже будет работать.

...