Какие параметры аннотации @Id указывать для идентификатора сущности
Что проверяют
Знаете ли вы, что у самой @Id параметров нет: это аннотация-маркер, а всё, что обычно называют её «параметрами», задают соседние аннотации. Следом почти всегда спрашивают, какую стратегию генерации вы выберете для PostgreSQL и как описать составной ключ.
Как отвечать
Начните с поправки к вопросу: @Id только помечает поле первичным ключом, а настраивают его рядом:
@GeneratedValue: атрибутыstrategyиgenerator. Стратегии:IDENTITY(автоинкремент колонки),SEQUENCE(последовательность в базе),TABLE(таблица-счётчик, медленно),AUTO(выбор за провайдером) и появившаяся в Jakarta Persistence 3.1UUID;@SequenceGenerator:name,sequenceName,allocationSize. По умолчаниюallocationSizeравен 50, и Hibernate резервирует идентификаторы пачкой, а не ходит в базу за каждым. Шаг последовательности в базе должен с этим числом совпадать;@Column:name,nullable,updatable. Для ключа обычно хватаетname;@EmbeddedIdс классом@Embeddableили@IdClass: составной ключ. Класс ключа реализуетSerializable,equalsиhashCode;@MapsId: ключ берётся из связанной сущности, например у профиля, который делит идентификатор с пользователем.
Добавьте практический вывод: с IDENTITY Hibernate не может группировать вставки в JDBC-батчи, потому что узнаёт id только после INSERT. Поэтому на PostgreSQL обычно выбирают SEQUENCE. Тип поля берут обёрточный, Long: null означает «ещё не сохранено», и по нему Spring Data в save решает, вызвать persist или merge. В проектах на Spring Boot 3 и новее импорты идут из jakarta.persistence, а не javax.persistence.
Где спотыкаются
Называют strategy атрибутом @Id. Это сразу показывает, что аннотации в коде вы видели, но не разбирались, какая за что отвечает.
Ставят на ключ @Column(unique = true). Первичный ключ уникален и так, атрибут ничего не добавляет.
Строят equals и hashCode на сгенерированном id. До сохранения он null, и сущность, положенная в HashSet до persist, потом в нём не находится.