Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое @Embeddable в JPA
@Embeddable — это аннотация JPA, которая позволяет создавать встраиваемые объекты (embeddable objects). Это класс, который не является самостоятельной сущностью, но может быть встроен в другую сущность и отображается на столбцы той же таблицы.
Основное отличие от @Entity
@Entity — отдельная таблица в БД, независимые связи и жизненный цикл.
@Embeddable — нет собственной таблицы, встраивается внутрь другой таблицы, часть жизненного цикла родительской сущности.
Простой пример
Представим, что у нас есть адрес, который используется несколько раз. Вместо повторения полей в разных таблицах создаем встраиваемый класс:
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
private String country;
public Address() {}
public Address(String street, String city, String zipCode, String country) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
this.country = country;
}
// Getters и Setters
public String getStreet() { return street; }
public void setStreet(String street) { this.street = street; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getZipCode() { return zipCode; }
public void setZipCode(String zipCode) { this.zipCode = zipCode; }
public String getCountry() { return country; }
public void setCountry(String country) { this.country = country; }
}
Использование в сущности
Теперь встраиваем этот класс в сущность Person:
@Entity
@Table(name = "persons")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "work_street")),
@AttributeOverride(name = "city", column = @Column(name = "work_city")),
@AttributeOverride(name = "zipCode", column = @Column(name = "work_zip_code")),
@AttributeOverride(name = "country", column = @Column(name = "work_country"))
})
private Address workAddress;
public Person() {}
// Getters и Setters
public Long getId() { return id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Address getHomeAddress() { return homeAddress; }
public void setHomeAddress(Address homeAddress) { this.homeAddress = homeAddress; }
public Address getWorkAddress() { return workAddress; }
public void setWorkAddress(Address workAddress) { this.workAddress = workAddress; }
}
Структура таблицы в БД
В базе данных будет одна таблица persons со столбцами:
CREATE TABLE persons (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255),
street VARCHAR(255),
city VARCHAR(255),
zip_code VARCHAR(10),
country VARCHAR(255),
work_street VARCHAR(255),
work_city VARCHAR(255),
work_zip_code VARCHAR(10),
work_country VARCHAR(255)
);
Когда использовать @Embeddable
- Данные не имеют независимого идентификатора
- Объект всегда используется вместе с родительской сущностью
- Нужно избежать дублирования кода для повторяющихся полей
- Данные тесно связаны и логически принадлежат одной сущности
Преимущества
✓ Избегаем создания лишних таблиц ✓ Переиспользуемость кода ✓ Лучшая организация кода ✓ Удобство при работе с сложными объектами
Отличие от наследования
@Embeddable — композиция (встраивание), @Inheritance — наследование. @Embeddable нужен когда объект является частью другого объекта, а не вариантом сущности.