Какой смысл использовать session.flush () в Hibernate? - PullRequest
94 голосов
/ 10 июля 2010

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

Ответы [ 9 ]

126 голосов
/ 10 июля 2010

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

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

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

62 голосов
/ 14 января 2013

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

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

22 голосов
/ 22 мая 2013

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

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

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

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

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

12 голосов
/ 10 июля 2010

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

Подробнее на веб-сайте Hibernate:

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

9 голосов
/ 13 января 2015

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

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

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

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

3 голосов
/ 12 июня 2017

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

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

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

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

Итак commit () = flush + commit.Таким образом, session.flush () просто выполняет операторы в базе данных (но не фиксирует), и операторы больше не находятся в памяти.Это просто заставляет сеанс сбрасываться.

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

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

2 голосов
/ 17 сентября 2018

Метод 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 Сессия.Хотя JPA определяет только две стратегии очистки (AUTO и COMMIT), Hibernate имеет гораздо более широкий спектр типов очистки:

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

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

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

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

0 голосов
/ 23 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...