[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-chto-takoe-dirty-checking-i-flush":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1039,"chto-takoe-dirty-checking-i-flush",19,"hibernate","Hibernate","🐻","Что такое Dirty Checking и Flush?","Dirty Checking — механизм Hibernate, автоматически отслеживающий изменения Persistent-сущностей. При flush Hibernate сравнивает текущее состояние объекта с его снимком (snapshot), сделанным при загрузке, и генерирует UPDATE для изменённых полей.\n\n```java\n@Transactional\npublic void updateUser(Long id) {\n    User user = entityManager.find(User.class, id);  \u002F\u002F загрузка + snapshot\n    user.setName(\"New Name\");  \u002F\u002F изменение в памяти\n    \u002F\u002F НЕ нужен вызов save() или update()!\n    \u002F\u002F При commit Hibernate обнаружит изменение и выполнит UPDATE\n}\n```\n\n### Flush\n\nFlush — процесс синхронизации Persistence Context с базой данных. При flush все накопленные изменения (INSERT, UPDATE, DELETE) отправляются в БД.\n\nКогда происходит flush:\n\n1. При `commit()` транзакции (автоматически)\n2. Перед выполнением JPQL\u002FHQL-запроса (чтобы запрос видел актуальные данные)\n3. При явном вызове `entityManager.flush()`\n\n### FlushMode\n\n```java\n\u002F\u002F AUTO (по умолчанию) — flush перед запросами и при commit\nentityManager.setFlushMode(FlushModeType.AUTO);\n\n\u002F\u002F COMMIT — flush только при commit (не перед запросами)\nentityManager.setFlushMode(FlushModeType.COMMIT);\n```\n\n### Порядок операций при flush\n\n1. INSERT (новые сущности — `persist()`)\n2. UPDATE (изменённые сущности — Dirty Checking)\n3. DELETE коллекций\n4. INSERT\u002FUPDATE коллекций\n5. DELETE (удалённые сущности — `remove()`)\n\n### Важное\n\n- Dirty Checking автоматический — изменили поле Persistent-объекта → UPDATE при flush\n- Flush =\u002F= commit; flush отправляет SQL, commit фиксирует транзакцию\n- `@DynamicUpdate` — генерирует UPDATE только для изменённых столбцов (по умолчанию — все столбцы)\n- `@Transactional(readOnly = true)` — подсказка Hibernate отключить Dirty Checking (оптимизация)\n\n### Частые ошибки\n\n- Вызов `save()` для уже managed-сущности — Spring Data `save()` вызовет `merge()`, создав лишнюю копию; для managed-сущностей достаточно изменить поля\n- Неожиданный UPDATE — изменили поле managed-объекта случайно → Hibernate выполнит UPDATE при flush\n- Порядок flush — DELETE выполняется после INSERT\u002FUPDATE; это может нарушить ограничения уникальности\n- Flush в цикле — `entityManager.flush()` в цикле может привести к деградации производительности\n\n### Как используется в 2026\n\n- Dirty Checking — фундаментальный механизм, работает прозрачно\n- `@DynamicUpdate` рекомендуется для таблиц с большим количеством столбцов\n- `readOnly = true` — обязательный паттерн для read-only транзакций (экономит память и CPU)\n\n> **На собеседовании:** объясните, что не нужен явный save() для managed-сущностей — Hibernate сам обнаружит изменения через снимок (snapshot) при загрузке. Разделяйте flush и commit: flush отправляет SQL, commit фиксирует транзакцию. Упомяните `@DynamicUpdate` и `readOnly = true` как оптимизации.","","middle",[15,16,17,18,7],"persistence-context","dirty-checking","flush","jpa",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Dirty Checking и Flush в Hibernate — Gymterview","Dirty Checking автоматически отслеживает изменения Persistent-сущностей. Flush синхронизирует Persistence Context с БД. FlushMode, @DynamicUpdate.","Dirty Checking и Flush: автоматическое отслеживание изменений в Hibernate — Gymterview","Hibernate сравнивает snapshot при загрузке с текущим состоянием и генерирует UPDATE. Flush: commit, перед запросом, явный вызов.",[27,28,29,30,31,32,33,8,34],"Dirty Checking","Flush","FlushMode","snapshot","@DynamicUpdate","readOnly","Persistence Context","JPA","Dirty Checking — механизм автоматического отслеживания изменений Persistent-сущностей. При flush Hibernate сравнивает текущее состояние с snapshot (снимком при загрузке) и генерирует UPDATE. Flush — синхронизация Persistence Context с БД. Происходит при commit, перед JPQL-запросом (AUTO), при явном вызове flush(). Flush не равен commit: flush отправляет SQL, commit фиксирует транзакцию.",true]