Введение
В этой статье мы поговорим об операции 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, когда не считает это необходимым.
Подробнее