@GeneratedValue

@GeneratedValue задаёт стратегию получения первичного ключа. Это часть маппинга @Id.

@Id
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "order_seq"
)
@SequenceGenerator(
    name = "order_seq",
    sequenceName = "order_seq",
    allocationSize = 50
)
private Long id;

Стратегии

  • AUTO — провайдер выбирает подход;
  • IDENTITY — ключ генерируется при вставке; ранний INSERT может мешать JDBC batch;
  • SEQUENCE — ключ берётся из sequence до вставки, удобно резервировать блоками;
  • TABLE — отдельная таблица генератора, обычно создаёт лишнюю конкуренцию;
  • UUID — стандартная стратегия в новых версиях Jakarta Persistence для UUID-полей.

Поддержка определяется СУБД и версией JPA-провайдера. Универсального «самого быстрого» варианта нет.

allocationSize

Провайдер может получать диапазон идентификаторов одним обращением. Пропуски в последовательности нормальны: rollback, перезапуск и резервирование блока не обязаны сохранять непрерывность.

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

  1. Почему IDENTITY мешает batch insert? Идентификатор часто известен только после фактической вставки каждой строки.
  2. Можно ли считать ID последовательным бизнес-номером? Нет, технический ключ допускает пропуски.
  3. Что делает AUTO? Делегирует выбор провайдеру; фактическая стратегия может отличаться между БД.
  4. Почему UUID не всегда лучше? Широкий случайный ключ увеличивает индекс и может ухудшать локальность вставок.

Связано: Генерация первичных ключей Hibernate, Как смапить составной ключ.