Как работает flush в Hibernate?

Введение

В этой статье мы поговорим об операции flush. Операция flush позволяет нам сихронизировать in-memory состояние Persistence контекста с БД (т.е. записывает изменения в БД). Но сначала обсудим состояния сущности.

Согласно документации Hibernate сущность может быть в одном из следующих состояний:

  • new/transient:  состояние, в котором, новый созданный объект, о чьем существовании не знает СУБД и он не привязан к persistance контексту.
  • persistent: сущность привязана к persistence контексту (находясь в кэше первого уровня) и есть запись в БД отбражающая эту сущность.
  • detached: сущность была привязана к persistence контексту, но контекст закрылся, а сущность осталась.
  • removed: сущность в данном состоянии помечена как удаленная и persistence контекст удалит ее из БД, когда наступит flush-time.

Передвижение объекта из одного состояния в другое выполняется вызовом методов EntityManager:

  • persist()
  • merge()
  • remove()

Каскадное выполнение позволяет распространять изменение от родительского объекта к дочернему, также облегчая управление отношениями между объектами.

В течение flush time, Hibernate транслирует изменения записанные текущим Persistence контекстом в SQL запросы.

Когда происходит flush?

Flush происходит в трех ситуациях:

  • Когды вы делает commit транзакции Hibernate
  • До того как выполняется запрос в БД
  • Когда вы вызываете entityManager.flush()

Особенно важно понять вторую из этих ситуаций — entityManager делает flush до выполнения запроса. Это происходит не для каждого запроса! Важно учесть, что цель сессии Hibernate минимизировать количество операций записи в БД, поэтому она не делает flush, когда не считает это необходимым.

Подробнее