it-roy-ru.com

Какая польза от session.flush () в Hibernate

Когда мы обновляем запись, мы можем использовать session.flush() с Hibernate. Что нужно для flush()?

89
CHANTI

Очистка сеанса вынуждает Hibernate синхронизировать состояние Session в памяти с базой данных (т.е. записывать изменения в базу данных). По умолчанию Hibernate автоматически сбросит изменения:

  • перед выполнением некоторых запросов 
  • когда сделка совершена

Разрешение явного сброса Session дает более точный контроль, который может потребоваться в некоторых обстоятельствах (для получения назначенного идентификатора, для управления размером сеанса, ...).

119
Pascal Thivent

Как правильно сказано в ответах выше, вызывая flush(), мы заставляем hibernate выполнять команды SQL в базе данных. Но поймите, что изменения еще не «зафиксированы». Таким образом, после выполнения сброса и перед выполнением фиксации, если вы обращаетесь к БД напрямую (скажем, из SQL-приглашения) и проверяете измененные строки, вы НЕ увидите изменений. 

Это то же самое, что открыть 2 сеанса команд SQL. И изменения, сделанные за 1 сеанс, не видны другим, пока не зафиксированы.

59
Kaushik Lele

Я только знаю, что когда мы вызываем session.flush(), наши операторы выполняются в базе данных, но не фиксируются.

Предположим, что мы не вызываем метод flush() для объекта сеанса, и если мы вызываем метод commit, он будет внутренне выполнять работу по выполнению операторов в базе данных и затем фиксации.

commit=flush+commit (в случае функциональности)

Таким образом, я заключаю, что когда мы вызываем метод flush () для объекта Session, он не получает фиксацию, а попадает в базу данных, выполняет запрос и получает откат.

Для фиксации мы используем commit () на объекте Transaction.

21
Shoaib Chikate

При очистке сеанса данные, которые в данный момент находятся в сеансе, синхронизируются с тем, что находится в базе данных.

Больше на сайте Hibernate:

flush() полезен, потому что нет абсолютно никаких гарантий относительно того, когда Session выполняет вызовы JDBC, только порядок, в котором они выполняются - за исключением того, что вы используете flush().

12
miku

Вы можете использовать flush, чтобы принудительно реализовывать и обнаруживать ограничения проверки в известном месте, а не когда транзакция зафиксирована. Может случиться так, что commit вызывается неявно некоторой структурной логикой, декларативной логикой, контейнером или шаблоном. В этом случае любое сгенерированное исключение может быть трудно уловить и обработать (оно может быть слишком высоким в коде).

Например, если вы save() новый объект EmailAddress, который имеет уникальное ограничение на адрес, вы не получите сообщение об ошибке, пока не совершите фиксацию.

Вызов flush() заставляет вставить строку, вызывая исключение, если есть дубликат.

Однако вам придется откатить сеанс после исключения.

9
rghome

Я просто хотел бы объединить все ответы, приведенные выше, а также связать метод Flush () с Session.save (), чтобы придать большее значение 

Hibernate save () может быть использован для сохранения объекта в базе данных. Мы можем вызвать этот метод вне транзакции, поэтому мне не нравится этот метод для сохранения данных. Если мы используем это без транзакции, и у нас есть каскад между сущностями, то только первичная сущность будет сохранена, если мы не очистим сеанс.

flush (): принудительно завершает сеанс. Он используется для синхронизации данных сеанса с базой данных.

Когда вы вызываете session.flush (), операторы выполняются в базе данных, но они не будут зафиксированы . Если вы не вызываете session.flush () и если вы вызываете session.commit (), внутренне передайте метод () выполняет заявление и фиксирует.

Так что commit () = flush + commit . Поэтому session.flush () просто выполняет операторы в базе данных (но не коммиты), и операторы больше НЕ В ПАМЯТИ. Это просто заставляет сеанс сбрасывать.

Несколько важных моментов:

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

3
Sundar Gsv

Метод flush() заставляет Hibernate сбрасывать сеанс. Вы можете настроить Hibernate на использование режима очистки для сеанса с помощью метода setFlushMode() . Чтобы получить режим сброса для текущего сеанса, вы можете использовать метод getFlushMode() . Чтобы проверить, является ли сессия грязной, вы можете использовать метод isDirty() . По умолчанию Hibernate управляет сбросом сеансов.

Как указано в документации:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html

Промывка

Промывка - это процесс синхронизации состояния постоянства контекст с базовой базой данных. EntityManager и Hibernate Session выставить набор методов, с помощью которых разработчик приложения может изменить постоянное состояние объекта.

Контекст постоянства действует как кэш транзакционной записи с обратной записью, постановка в очередь любого изменения состояния объекта. Как и любой кэш с обратной записью, изменения сначала применяются в памяти и синхронизируются с базой данных во время промойте время. Операция сброса принимает каждое изменение состояния объекта и переводит его в оператор INSERT, UPDATE или DELETE.

Стратегия очистки задается flushMode текущей работает Hibernate Session. Хотя JPA определяет только два сброса стратегии ( AUTO и COMMIT ), Hibernate имеет много более широкий спектр типов флеша:

  • ALWAYS: очищает сессию перед каждым запросом;
  • AUTO: это режим по умолчанию, который сбрасывает сессию только при необходимости;
  • COMMIT: Сеанс пытается отложить сброс до тех пор, пока не будет зафиксирована текущая транзакция, хотя она может также сбрасываться преждевременно;
  • MANUAL: Сброс сеанса делегируется приложению, которое должно явно вызвать Session.flush() для применения постоянство изменения контекста.

По умолчанию Hibernate использует режим сброса AUTO, который вызывает промывка при следующих обстоятельствах:

  • до совершения Сделки;
  • до выполнения запроса JPQL/HQL, который перекрывается с действиями объекта в очереди;
  • перед выполнением любого собственного запроса SQL, который не имеет зарегистрированной синхронизации.
1
Aleksey Bykov

Вызов EntityManager#flush имеет побочные эффекты. Он удобно используется для типов объектов с генерируемыми значениями идентификаторов (значениями последовательности): такой идентификатор доступен только при синхронизации с нижележащим постоянным уровнем. Если этот идентификатор требуется до завершения текущей транзакции (например, для целей ведения журнала), очистка сеанса обязательна.

0
johanwannheden

С помощью этого метода вы вызываете процесс сброса. Этот процесс синхронизируется состояние вашей базы данных с состоянием вашего сеанса, обнаруживая изменения состояния и выполняя соответствующие операторы SQL.

0
lennoxGER