@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, перезапуск и резервирование блока не обязаны сохранять непрерывность.
Вопросы для повторения
- Почему IDENTITY мешает batch insert? Идентификатор часто известен только после фактической вставки каждой строки.
- Можно ли считать ID последовательным бизнес-номером? Нет, технический ключ допускает пропуски.
- Что делает AUTO? Делегирует выбор провайдеру; фактическая стратегия может отличаться между БД.
- Почему UUID не всегда лучше? Широкий случайный ключ увеличивает индекс и может ухудшать локальность вставок.
Связано: Генерация первичных ключей Hibernate, Как смапить составной ключ.