Какие условия должен выполнять класс, чтобы стать сущностью (Entity) в JPA/Hibernate?

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

Ответ

Для того чтобы класс был отображен как сущность в JPA (Java Persistence API), он должен соответствовать следующим требованиям:

  1. Аннотация @Entity: Класс должен быть помечен этой аннотацией.
  2. Открытый или защищенный конструктор без аргументов: Обязателен для фреймворка при создании экземпляров через рефлексию.
    public User() {}
  3. Не быть final: Класс, его поля и геттеры/сеттеры не должны быть объявлены как final, чтобы Hibernate мог создать прокси для ленивой загрузки.
  4. Наличие первичного ключа (@Id): Должно быть хотя бы одно поле, аннотированное @Id. Часто используется @GeneratedValue для автоматической генерации.
  5. Доступ к состоянию: Поля должны быть доступны либо напрямую (не private), либо через геттеры/сеттеры в соответствии с JavaBeans-конвенцией.

Пример корректной сущности:

@Entity
@Table(name = "users") // Опционально: задает имя таблицы
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String email;

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

    // Геттеры и сеттеры
    public Long getId() { return id; }
    // ... остальные геттеры/сеттеры
}

Важно: Сущность также должна быть привязана к уникальной таблице (или представлению) в БД. Поля, не предназначенные для сохранения, помечаются @Transient.