Какие минимальные требования к классу JPA Entity?

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

Ответ

Класс, являющийся JPA-сущностью (Entity), должен соответствовать следующим требованиям:

  1. Аннотация @Entity: Помечает класс как постоянную сущность.
  2. Первичный ключ (@Id): Должно быть хотя бы одно поле с аннотацией @Id. Часто используется @GeneratedValue для автоинкремента.
  3. Конструктор без аргументов: Должен быть public или protected конструктор по умолчанию.
  4. Класс не должен быть final: Поля (или геттеры) не должны быть final, если используется проксирование (например, для ленивой загрузки).

Рекомендуемые (но не обязательные) практики:

  • Реализация методов equals() и hashCode() (обычно на основе первичного ключа).
  • Использование аннотаций @Table, @Column для явного указания имен таблиц и столбцов.
  • Наличие геттеров и сеттеров для полей.

Минимальный рабочий пример:

import javax.persistence.*;

@Entity // 1. Обязательная аннотация
public class Product {
    @Id // 2. Обязательный первичный ключ
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name; // Имя столбца будет 'name'

    public Product() {} // 3. Обязательный конструктор без аргументов

    // Геттеры и сеттеры
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

Важно: Сущность не должна содержать логики бизнес-процессов, это должен быть простой POJO-класс для отображения данных.