← Назад к вопросам

Что такое @Embeddable?

2.0 Middle🔥 201 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое @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 нужен когда объект является частью другого объекта, а не вариантом сущности.