[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-strategii-generatsii-identifikatorov":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},753,"strategii-generatsii-identifikatorov",19,"hibernate","Hibernate","🐻","Стратегии генерации идентификаторов","Стратегия генерации ID определяет, как будет назначаться первичный ключ новой сущности.\n\n### Основные стратегии JPA\n\n| Стратегия | Механизм | Batch insert | Рекомендация |\n|-----------|----------|-------------|--------------|\n| IDENTITY | Автоинкремент БД | Не поддерживает | MySQL (простые случаи) |\n| SEQUENCE | Sequence в БД | Поддерживает | PostgreSQL, Oracle |\n| TABLE | Таблица-счётчик | Поддерживает | Не рекомендуется (медленно) |\n| AUTO | Hibernate выбирает | Зависит от выбора | Не для продакшена |\n| UUID | UUID-генерация | Поддерживает | Распределённые системы |\n\n\u003Cdetails>\n\u003Csummary>Примеры каждой стратегии\u003C\u002Fsummary>\n\n```java\n\u002F\u002F 1. IDENTITY — автоинкремент на стороне БД\n@Id\n@GeneratedValue(strategy = GenerationType.IDENTITY)\nprivate Long id;\n\u002F\u002F БД генерирует ID при INSERT\n\u002F\u002F Не поддерживает batch insert — Hibernate выполняет INSERT немедленно для получения ID\n\n\u002F\u002F 2. SEQUENCE — последовательность в БД (рекомендуемая)\n@Id\n@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"user_seq\")\n@SequenceGenerator(name = \"user_seq\", sequenceName = \"user_sequence\",\n                   allocationSize = 50)\nprivate Long id;\n\u002F\u002F Hibernate заранее запрашивает блок ID из sequence (allocationSize)\n\u002F\u002F Поддерживает batch insert — ID известен до выполнения INSERT\n\n\u002F\u002F 3. TABLE — отдельная таблица для хранения счётчиков\n@Id\n@GeneratedValue(strategy = GenerationType.TABLE, generator = \"user_gen\")\n@TableGenerator(name = \"user_gen\", table = \"id_generator\",\n                pkColumnName = \"gen_key\", valueColumnName = \"gen_value\",\n                allocationSize = 50)\nprivate Long id;\n\u002F\u002F Переносима между БД, но самая медленная — требует блокировки строки\n\n\u002F\u002F 4. AUTO — Hibernate сам выбирает\n@Id\n@GeneratedValue(strategy = GenerationType.AUTO)\nprivate Long id;\n\u002F\u002F В Hibernate 6 по умолчанию выбирает SEQUENCE (если БД поддерживает) или TABLE\n\n\u002F\u002F 5. UUID\n@Id\n@GeneratedValue(strategy = GenerationType.UUID)\nprivate UUID id;\n\u002F\u002F Подходит для распределённых систем (не зависит от БД)\n\u002F\u002F Занимает 16 байт вместо 8 (Long), хуже индексируется в B-Tree\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n\n- SEQUENCE — рекомендуемая стратегия для PostgreSQL\u002FOracle (поддерживает batch insert)\n- IDENTITY — проще, но блокирует batch insert (Hibernate выполняет INSERT сразу для получения ID)\n- `allocationSize` у SEQUENCE — Hibernate запрашивает блок ID одним запросом, снижая обращения к БД\n- UUID — для распределённых систем, где централизованная генерация ID невозможна\n\n### Частые ошибки\n\n- IDENTITY + batch insert — batch insert невозможен с IDENTITY; если нужны пакетные вставки — SEQUENCE\n- `allocationSize=1` у SEQUENCE — Hibernate будет вызывать `nextval` на каждый INSERT; увеличьте до 50\n- Несовпадение `allocationSize` и INCREMENT в БД — allocationSize в аннотации и INCREMENT BY в DDL sequence должны совпадать\n- AUTO в Hibernate 6 — по умолчанию выбирает TABLE (не SEQUENCE!) для некоторых БД, что медленнее\n\n### Как используется в 2026\n\n- SEQUENCE с `allocationSize=50` — стандарт для PostgreSQL-приложений\n- UUID v7 (time-ordered) — набирает популярность для распределённых систем (лучше индексируется чем UUID v4)\n- Hibernate 6.x: `@UuidGenerator(style = TIME)` — генерация time-based UUID\n- TSID (Time-Sorted ID) — альтернатива UUID, компактнее (Long), используется в некоторых проектах\n\n> **На собеседовании:** интервьюер ожидает сравнение IDENTITY vs SEQUENCE. Главный аргумент за SEQUENCE — поддержка batch insert. Упомяните allocationSize и объясните, почему значение по умолчанию (50) лучше 1. Если спросят про распределённые системы — UUID v7.","","middle",[15,16,7,17,18],"sequence","jpa","primary-key","uuid",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":36,"featuredSnippetReady":37},"Стратегии генерации идентификаторов в JPA\u002FHibernate — Gymterview","IDENTITY, SEQUENCE, TABLE, AUTO, UUID — сравнение стратегий генерации ID. Почему SEQUENCE лучше для batch insert, allocationSize и UUID v7.","Стратегии генерации ID: IDENTITY vs SEQUENCE vs UUID — Gymterview","Сравнение стратегий генерации первичного ключа в Hibernate. SEQUENCE + allocationSize для batch insert. UUID v7 для распределённых систем.",[27,28,29,30,31,32,33,34,8,35],"GenerationType","IDENTITY","SEQUENCE","TABLE","AUTO","UUID","batch insert","allocationSize","JPA","JPA поддерживает 5 стратегий: IDENTITY (автоинкремент, не поддерживает batch), SEQUENCE (рекомендуемая, поддерживает batch, allocationSize=50), TABLE (медленная, редко используется), AUTO (Hibernate выбирает сам), UUID (для распределённых систем). SEQUENCE — стандарт для PostgreSQL\u002FOracle. IDENTITY блокирует batch insert, так как Hibernate должен выполнить INSERT для получения ID.",true]