Я просто хотел бы объединить все ответы, приведенные выше, а также связать метод Flush () с Session.save (), чтобы придать ему большую важность.
Hibernate save () можно использовать для сохранения объекта вбаза данных.Мы можем вызвать этот метод вне транзакции, поэтому мне не нравится этот метод для сохранения данных.Если мы используем это без транзакции и у нас есть каскад между сущностями, то только основная сущность будет сохранена, если мы не очистим сеанс.
flush (): принудительно очищает сеанс.Он используется для синхронизации данных сеанса с базой данных.
Когда вы вызываете session.flush (), операторы выполняются в базе данных, но не фиксируются.Если вы не вызываете session.flush () и если вы вызываете session.commit (), внутренний метод commit () выполняет инструкцию и фиксирует.
Итак commit () = flush + commit.Таким образом, session.flush () просто выполняет операторы в базе данных (но не фиксирует), и операторы больше не находятся в памяти.Это просто заставляет сеанс сбрасываться.
Несколько важных моментов:
Мы должны избегать сохранения за пределами границы транзакции, иначе сопоставленные объекты не будут сохранены, что приведет к несогласованности данных.Очень нормально забыть сбросить сессию, потому что она не выдает никаких исключений или предупреждений.По умолчанию Hibernate автоматически сбрасывает изменения: перед выполнением некоторых запросов при фиксации транзакции. Разрешение явной очистки сеанса дает более точный контроль, который может потребоваться в некоторых обстоятельствах (для получения назначенного идентификатора, для управления размером сеанса).)