Как JPA использует аннотации для отображения объектов на реляционные таблицы?

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

Ответ

Java Persistence API (JPA) — это стандарт ORM (Object-Relational Mapping) в Java. Аннотации JPA используются для декларативного описания соответствия между Java-классами (сущностями) и таблицами базы данных.

Основные аннотации для маппинга сущности:

Аннотация Назначение
@Entity Помечает класс как JPA-сущность. Обязательна.
@Table(name = "...") Задаёт имя таблицы в БД. Если не указано, используется имя класса.
@Id Помечает поле как первичный ключ.
@GeneratedValue Определяет стратегию генерации значений для @Id (IDENTITY, SEQUENCE, TABLE, AUTO).
@Column(name = "...") Связывает поле со столбцом таблицы. Позволяет задать nullable, unique, length.
@Enumerated(EnumType.STRING) Указывает, как сохранять enum (по строковому имени или порядковому номеру).
@Temporal(TemporalType.DATE) Указывает точность для полей java.util.Date/Calendar.
@Lob Помечает поле для хранения больших объектов (BLOB/CLOB).

Пример отображения простой сущности:

@Entity
@Table(name = "employees") // Таблица в БД будет называться "employees"
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Автоинкремент в БД
    private Long id;

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

    @Column(unique = true)
    private String email;

    @Enumerated(EnumType.STRING) // Сохраняем как строку 'JUNIOR', 'SENIOR'
    private EmployeeLevel level;

    // Конструкторы, геттеры, сеттеры
}

Аннотации для связей между сущностями:

  • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany — определяют тип связи.
  • @JoinColumn — указывает столбец внешнего ключа.
  • @JoinTable — определяет таблицу-ассоциацию для связи @ManyToMany.

Пример связи @ManyToOne:

@Entity
public class Order {
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY) // Загрузка по требованию
    @JoinColumn(name = "customer_id") // Столбец внешнего ключа в таблице 'order'
    private Customer customer;
}

Преимущества: Аннотации позволяют описывать схему данных прямо в коде, что делает её наглядной и упрощает разработку. Провайдер JPA (например, Hibernate) на основе этих аннотации генерирует необходимые SQL-запросы.