Что проверено за FlushMode.AUTO? - PullRequest
4 голосов
/ 28 августа 2011

Интересно, в Hibernate какие условия вызывают сброс, когда flushMode имеет значение AUTO? Это может быть сложно (или «волшебно»), но каковы основные условия?

Спасибо

1 Ответ

10 голосов
/ 28 августа 2011

Когда режим очистки равен FlushMode.AUTO, это произойдет в следующие моменты:

  • Перед выполнением запроса
  • Когда транзакция в Hibernate API фиксируется
  • Когда приложение явно вызывает session.flush ()

Цель этого режима - избежать устаревшего состояния. Изменения, внесенные в объекты в памяти, могут конфликтовать с результатами запроса. Насколько я понимаю, Hibernate будет выполнять «грязную проверку», сравнивать исходное и текущее состояние объектов. Если они различаются, и Hibernate думает, что это различие подвергнет вас устаревшим данным, он попытается передать это состояние в базу данных. Это возможно, потому что Hibernate знает, какие таблицы будут «затронуты» запросом и какие таблицы нужно будет обновить для текущего грязного состояния.

Взгляните на эту статью :

Авто-промывка довольно умна, когда нужно промывать, хотя некоторые ситуации могут быть трудно обнаружить. Чтобы улучшить производительность, Hibernate не просто всегда сбрасывает все, но смотрит на таблицы в базе данных, к которой обращается запрос, и данные в памяти это должно быть сохранено в этих таблицах. Если нет перекрытия, нет данных будет сохраняться Если совпадение обнаружено, весь сеанс будет промыть, чтобы обеспечить последовательность.

Вы также можете посмотреть org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush исходный код .

Есть пара недостатков FlushMode.AUTO:

  • вы не контролируете, когда Hibernate решит выполнить UPDATE / INSERT / DELETE
  • потенциальные проблемы с производительностью, потому что каждая модификация объекта может привести к грязной проверке + выполнению инструкции DML
  • вы не используете преимущества пакетной обработки и других оптимизаций, которые может выполнять Hibernate, когда он не пытается избежать «устаревшего» состояния

Из-за этих недостатков я предпочитаю FlushMode.COMMIT, который дает вам больше контроля. В этом режиме Hibernate ожидает, пока вы явно не вызовете Commit или Flush, и синхронизирует только состояние в памяти с базой данных.

...