Встраиваемый класс: 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.
Вопросы для повторения
- Создаёт ли
@Embeddableотдельную таблицу? Нет. - Чем embeddable отличается от entity? У него нет собственной идентичности и жизненного цикла.
- Зачем
@AttributeOverride? Чтобы переопределить столбцы встроенного объекта у конкретного владельца. - Можно ли встроить один тип дважды? Да, обычно с разными overrides.
Связано: Как смапить составной ключ, Аннотация Column, Сохранение коллекций базовых типов Hibernate.