[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-batch-operatsii-v-hibernate":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},1044,"batch-operatsii-v-hibernate",19,"hibernate","Hibernate","🐻","Batch-операции в Hibernate","Batch-операции позволяют выполнять массовые INSERT\u002FUPDATE\u002FDELETE эффективно, группируя SQL-запросы в пакеты вместо отправки по одному.\n\n### Настройка batch insert\u002Fupdate\n\n```properties\n# application.properties\nspring.jpa.properties.hibernate.jdbc.batch_size=50\nspring.jpa.properties.hibernate.order_inserts=true\nspring.jpa.properties.hibernate.order_updates=true\nspring.jpa.properties.hibernate.jdbc.batch_versioned_data=true\n```\n\n### Batch INSERT\n\n```java\n@Transactional\npublic void batchInsert(List\u003CUser> users) {\n    for (int i = 0; i \u003C users.size(); i++) {\n        entityManager.persist(users.get(i));\n\n        if (i % 50 == 0) { \u002F\u002F batch_size = 50\n            entityManager.flush();  \u002F\u002F отправить SQL в БД\n            entityManager.clear();  \u002F\u002F очистить L1 Cache (освободить память)\n        }\n    }\n}\n```\n\n### IDENTITY vs SEQUENCE для batch\n\n```java\n\u002F\u002F IDENTITY — batch insert НЕВОЗМОЖЕН!\n\u002F\u002F Hibernate выполняет INSERT сразу для получения ID\n@GeneratedValue(strategy = GenerationType.IDENTITY) \u002F\u002F не подходит для batch\n\n\u002F\u002F SEQUENCE — batch insert РАБОТАЕТ\n\u002F\u002F Hibernate заранее получает блок ID из sequence\n@GeneratedValue(strategy = GenerationType.SEQUENCE,\n                generator = \"user_seq\")\n@SequenceGenerator(name = \"user_seq\", allocationSize = 50) \u002F\u002F подходит для batch\n```\n\n### Bulk UPDATE\u002FDELETE (JPQL — обходит Persistence Context)\n\n```java\n@Modifying\n@Query(\"UPDATE User u SET u.status = :status WHERE u.lastLogin \u003C :date\")\nint deactivateInactiveUsers(@Param(\"status\") UserStatus status,\n                            @Param(\"date\") LocalDateTime date);\n\u002F\u002F Один SQL UPDATE, без загрузки сущностей\n\u002F\u002F ВАЖНО: @Modifying(clearAutomatically = true) — очистить L1 Cache после\n```\n\n### Важное\n\n- batch_size — количество SQL-операций, группируемых в один batch\n- `order_inserts\u002Forder_updates` — обязательно для эффективного batch (группировка по таблицам)\n- `flush() + clear()` каждые N записей — предотвращение OutOfMemoryError при больших batch\n- SEQUENCE стратегия генерации ID — обязательна для batch INSERT (IDENTITY не поддерживает batch)\n\n### Частые ошибки\n\n- IDENTITY + batch — Hibernate выполняет INSERT по одному; batch не работает\n- Не вызывать `clear()` — L1 Cache растёт с каждой persist(), 1M сущностей → OOM\n- Bulk UPDATE без `clearAutomatically` — L1 Cache содержит устаревшие данные, следующий `find()` вернёт старое значение\n- Не включить order_inserts — без сортировки Hibernate перемешивает INSERT разных таблиц, batch не формируется\n\n### Как используется в 2026\n\n- Для массовых операций (импорт данных, миграции) — JDBC batch напрямую (через JdbcTemplate) или jOOQ\n- Hibernate batch — для умеренных объёмов (тысячи, не миллионы)\n- Spring Batch — для ETL-задач с миллионами записей\n- `@Modifying` JPQL — для bulk UPDATE\u002FDELETE; самый простой способ массового обновления\n\n> **На собеседовании:** ключевые моменты: batch_size + order_inserts + SEQUENCE (не IDENTITY!). Объясните, почему IDENTITY блокирует batch insert (Hibernate должен выполнить INSERT сразу для получения ID). Упомяните flush\u002Fclear паттерн для предотвращения OOM. Для миллионов записей — JDBC напрямую или Spring Batch.","","senior",[15,16,17,18,7],"performance","optimization","batch","jpa",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Batch-операции в Hibernate — Gymterview","Batch INSERT\u002FUPDATE: batch_size, order_inserts, SEQUENCE (не IDENTITY!), flush+clear паттерн. Bulk JPQL через @Modifying. Spring Batch для миллионов.","Batch-операции в Hibernate: настройка, IDENTITY vs SEQUENCE, flush+clear — Gymterview","Как настроить batch insert в Hibernate: batch_size, order_inserts, SEQUENCE. Почему IDENTITY не поддерживает batch. flush+clear для OOM.",[27,28,29,30,31,32,33,34,8],"batch insert","batch_size","order_inserts","SEQUENCE","IDENTITY","flush clear","bulk UPDATE","@Modifying","Batch-операции группируют SQL в пакеты: batch_size=50, order_inserts=true, order_updates=true. SEQUENCE обязательна (IDENTITY не поддерживает batch — Hibernate выполняет INSERT сразу для получения ID). Паттерн flush()+clear() каждые N записей предотвращает OOM. Bulk UPDATE\u002FDELETE через JPQL @Modifying обходит Persistence Context — нужен clearAutomatically=true. Для миллионов — JDBC\u002FSpring Batch.",true]