Генерация первичных ключей Hibernate

Выбор генератора влияет не только на вид ключа, но и на batch insert, индексы и переносимость.

СтратегияКогда ключ известенОсобенность
IDENTITYпосле/во время INSERTпросто, но часто ограничивает batch
SEQUENCEдо INSERTможно резервировать блоки
TABLEпосле блокировки строки генераторапереносимо, но создаёт конкуренцию
UUIDв приложении или провайдерене нужен центральный sequence, ключ шире
AUTOзависит от выбора провайдераудобно, но менее явно

Как выбирать

  • PostgreSQL и Oracle хорошо работают с sequence;
  • identity естественна для БД с auto-increment, если batch не критичен;
  • UUID удобен для распределённого создания, но формат и порядок влияют на индекс;
  • бизнес-номер не следует использовать как технический PK только ради «красивой» последовательности.

Hibernate может оптимизировать sequence через pooled allocation. Поэтому sequence в БД и значения приложения могут идти с пропусками — это штатно.

Вопросы для повторения

  1. Какая стратегия позволяет получить ID до INSERT? Обычно SEQUENCE и UUID.
  2. Почему ключи имеют пропуски? Резервирование диапазона, rollback и перезапуски.
  3. Можно ли обещать пользователю последовательный номер по PK? Нет, для этого нужен отдельный бизнес-механизм.
  4. Что выбрать для batch insert? Часто sequence с allocation; решение подтверждают измерением на конкретной БД.

Связано: Аннотация GeneratedValue, Как смапить составной ключ, Hibernate.