Какая аннотация JPA/Hibernate используется для генерации первичного ключа (ID) базой данных?

«Какая аннотация JPA/Hibernate используется для генерации первичного ключа (ID) базой данных?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для делегирования генерации первичного ключа базе данных используется аннотация @GeneratedValue, которая указывается вместе с @Id.

Основные стратегии (strategy):

Стратегия (GenerationType) Описание Пример СУБД
IDENTITY База данных генерирует уникальное значение (автоинкремент). ID становится известен только после INSERT. MySQL AUTO_INCREMENT, PostgreSQL SERIAL/BIGSERIAL.
SEQUENCE Использует объект sequence базы данных для генерации значений. Более эффективно, чем TABLE. Oracle, PostgreSQL.
TABLE Эмулирует sequence с помощью отдельной таблицы. Универсально, но наименее производительно. Любая СУБД.
AUTO (по умолчанию) Провайдер JPA (Hibernate) сам выбирает стратегию. Зависит от диалекта.

Рекомендуемый пример для PostgreSQL/MySQL:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // База данных сама увеличивает значение
    private Long id;

    private String name;
    // ...
}

Важно: Стратегия SEQUENCE в Hibernate часто предпочтительнее для пакетной вставки, так как позволяет эффективнее использовать batch-операции.