Ответ
Embeddable-класс (встраиваемый класс) в JPA — это класс, помеченный аннотацией @Embeddable, который представляет собой группу полей, логически принадлежащих сущности, но не являющихся самостоятельной сущностью. Его поля сохраняются в таблице родительской сущности.
Зачем это нужно? Для нормализации объектной модели без создания лишних таблиц и JOIN-ов в БД.
Пример: Группировка адреса внутри сущности Person.
-
Создаем Embeddable-класс
Address:@Embeddable public class Address { private String city; private String street; private String zipCode; // Конструкторы, геттеры, сеттеры }Этот класс не имеет
@Id,@Entityи своей таблицы в БД. -
Используем его в сущности
Person:@Entity public class Person { @Id private Long id; private String name; @Embedded private Address homeAddress; @Embedded @AttributeOverrides({ @AttributeOverride(name = "city", column = @Column(name = "work_city")), @AttributeOverride(name = "street", column = @Column(name = "work_street")) }) private Address workAddress; // Геттеры, сеттеры }В таблице
Personпоявятся колонки:city,street,zip_code,work_city,work_street.
Ключевые особенности:
- Нет отдельной таблицы: Все поля
Addressхранятся в таблицеPerson. - Нет собственного идентификатора: Не может существовать отдельно от сущности-владельца.
- Может использоваться в нескольких сущностях: Класс
Addressможно встроить вCompany,Officeи т.д. - Поддерживает переопределение колонок: Аннотация
@AttributeOverridesпозволяет задать имена колонок для каждого встраивания. - Может содержать другие
@Embeddableобъекты: Поддерживается вложенность.
Использование: Для типов-значений (Value Objects), таких как Деньги (Money с полями amount и currency), Геопозиция (Coordinates), Полное имя (FullName) и т.п.