Встраиваемый класс: Embeddable

Embeddable — value object без собственной идентичности. Его поля хранятся в таблице сущности-владельца.

@Embeddable
public class Address {
    @Column(name = "city", nullable = false)
    private String city;
 
    @Column(name = "street", nullable = false)
    private String street;
}
 
@Entity
public class Customer {
    @Id
    private Long id;
 
    @Embedded
    private Address address;
}

Для повторного использования с другими именами столбцов:

@Embedded
@AttributeOverrides({
    @AttributeOverride(
        name = "city",
        column = @Column(name = "delivery_city")
    ),
    @AttributeOverride(
        name = "street",
        column = @Column(name = "delivery_street")
    )
})
private Address deliveryAddress;

Свойства

  • у embeddable нет собственного @Id;
  • он живёт и сохраняется вместе с владельцем;
  • может входить в @EmbeddedId;
  • может содержать связи, но такой маппинг сложнее и требует проверки владельца;
  • изменение части value object делает сущность dirty.

Неизменяемый value object легче использовать в бизнес-коде, но поддержка конкретной модели конструкторов зависит от версии JPA/Hibernate.

Вопросы для повторения

  1. Создаёт ли @Embeddable отдельную таблицу? Нет.
  2. Чем embeddable отличается от entity? У него нет собственной идентичности и жизненного цикла.
  3. Зачем @AttributeOverride? Чтобы переопределить столбцы встроенного объекта у конкретного владельца.
  4. Можно ли встроить один тип дважды? Да, обычно с разными overrides.

Связано: Как смапить составной ключ, Аннотация Column, Сохранение коллекций базовых типов Hibernate.