Какими свойствами должен обладать класс, чтобы его можно было отобразить на таблицу в БД с помощью JPA/Hibernate?

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

Ответ

Для маппинга класса на таблицу БД с помощью JPA/Hibernate класс должен быть сущностью (Entity). Основные шаги и свойства:

  1. Пометить класс аннотацией @Entity.
  2. Определить первичный ключ с помощью @Id. Часто используется @GeneratedValue для автоматической генерации ID.
  3. Сопоставить класс с таблицей (опционально, но рекомендуется) с помощью @Table(name = "table_name").
  4. Сопоставить поля со столбцами с помощью @Column. Без этой аннотации поле всё равно будет маппиться на столбец с тем же именем.
  5. Соблюсти требования JPA к Entity (пустой конструктор, не-final класс и методы).

Полный пример маппинга:

@Entity // 1. Объявляем сущность
@Table(name = "employees") // 3. Указываем имя таблицы
public class Employee {
    @Id // 2. Первичный ключ
    @GeneratedValue(strategy = GenerationType.IDENTITY) // Автоинкремент в БД
    private Long id;

    @Column(name = "full_name", length = 200, nullable = false) // 4. Маппинг поля
    private String name;

    @Column(unique = true) // Ограничение UNIQUE
    private String email;

    @Transient // Поле НЕ будет сохранено в БД
    private String temporaryCode;

    // 5. Обязательный конструктор
    public Employee() {}

    // Конструктор для удобства
    public Employee(String name, String email) {
        this.name = name;
        this.email = email;
    }
    // Геттеры и сеттеры...
}

Ключевые аннотации для связей между таблицами:

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

Почему @Column не всегда обязателен? Hibernate по умолчанию маппит поле на столбец с тем же именем. Однако @Column необходим для задания дополнительных свойств: nullable, unique, length (для строк), precision/scale (для чисел).