Ответ
Класс, чтобы быть Entity в JPA (Java Persistence API), должен соответствовать следующим обязательным требованиям:
- Аннотация
@Entity— обязательная метка класса как сущности. - Пустой конструктор (может быть
protected) — требуется для рефлексии и создания прокси. - Класс не должен быть
final— иначе Hibernate не сможет создать прокси для ленивой загрузки. - Наличие первичного ключа — поле с аннотацией
@Id(может быть составным через@EmbeddedId). - Поля должны быть private/protected с геттерами/сеттерами — для доступа через отражение.
- Методы доступа (геттеры/сеттеры) не должны быть
final— по той же причине, что и класс.
Пример Entity-класса:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false, length = 100)
private String name;
// Обязательный пустой конструктор
public User() {}
// Геттеры и сеттеры (не final)
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; }
}
Почему эти правила важны:
- Пустой конструктор и не-final класс/методы нужны для работы механизма проксирования Hibernate, который реализует ленивую загрузку (Lazy Loading).
- Приватные поля с геттерами/сеттерами обеспечивают инкапсуляцию и дают Hibernate контролируемый доступ к данным через отражение.
@Idоднозначно идентифицирует запись в базе данных.