Gymterview
junior

Какие основные аннотации JPA для маппинга сущностей вы знаете?

JPA использует аннотации для маппинга Java-классов на таблицы БД. Минимальный набор: @Entity, @Id, @GeneratedValue.

Пример сущности со всеми основными аннотациями
@Entity
@Table(name = "users", schema = "public",
       uniqueConstraints = @UniqueConstraint(columnNames = {"email"}))
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "first_name", nullable = false, length = 100)
    private String firstName;

    @Column(unique = true, nullable = false)
    private String email;

    @Column(precision = 19, scale = 2)
    private BigDecimal balance;

    @Enumerated(EnumType.STRING) // всегда STRING, не ORDINAL!
    @Column(nullable = false)
    private UserStatus status;

    private LocalDateTime updatedAt; // @Temporal не нужна для Java 8+ Date API

    @Lob // для больших объектов (TEXT, BLOB)
    private String description;

    @Transient // НЕ маппится на колонку
    private String temporaryField;

    @Embedded
    private Address address;

    protected User() { } // конструктор без аргументов обязателен для JPA
}

Стратегии генерации ID

Strategy Описание
IDENTITY Автоинкремент БД (PostgreSQL SERIAL, MySQL AUTO_INCREMENT)
SEQUENCE Последовательность БД (рекомендуется для PostgreSQL)
TABLE Специальная таблица для генерации ID (медленно)
AUTO Провайдер выбирает стратегию сам
Пример
// Рекомендуемый вариант для PostgreSQL
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "users_id_seq", allocationSize = 50)
private Long id;

Частые ошибки

  1. @Enumerated(EnumType.ORDINAL) (по умолчанию) – при добавлении нового значения в enum порядок нарушится. Всегда используйте EnumType.STRING
  2. Забыть конструктор без аргументов – JPA не сможет создать экземпляр
  3. GenerationType.AUTO с Hibernate может создать таблицу hibernate_sequence вместо нативной последовательности

На собеседовании: ключевые аннотации – @Entity, @Id, @GeneratedValue, @Column, @Enumerated(STRING). Частая ошибка – использовать EnumType.ORDINAL.