6. Что такое встраиваемый (Embeddable) класс? Какие требования JPA предъявляет к встраиваемым (Embeddable) классам?
UnknownВстраиваемый (Embeddable) класс Это класс, который не используется сам по себе, а только как часть одного или нескольких Entity классов. Hibernate называет эти классы компонентами. JPA называет их встраиваемыми. В любом случае, концепция одна и та же: композиция значений.
Встраиваемый класс помечается аннотацией @Embeddable.
Встраиваемый класс может быть встроен в несколько классов-сущностей, но встроенный объект с конкретным состоянием принадлежит исключительно владеющей им сущности и не может использоваться одновременно другими сущностями, он не является общим для нескольких сущностей. То есть, если класс Person с полями name и age встроен и в класс Driver, и в класс Baker, то у обоих последних классов появятся оба поля из класса Person. Но если у объекта Driver эти поля будут иметь значения "Иван" и "35", то эти же поля у объекта Baker могут иметь совершенно иные значения, никак не связанные с объектом Driver.
В целом, встраиваемый класс служит для того, чтобы выносить определение общих атрибутов для нескольких сущностей, можно считать что JPA просто встраивает в сущность вместо объекта такого класса те атрибуты, которые он содержит.
Особенности встраиваемых классов
- все поля встраиваемого класса, даже коллекции, станут полями класса, в который происходит встраивание;
- встраиваемые классы могут быть встроены в одну и ту же сущность несколько раз, нужно только поменять имена полей;
- экземпляры встраиваемых классов, в отличие от экземпляров сущностей, не имеют собственного персистентного состояния, вместо этого они существуют только как часть состояния объекта, которому они принадлежат;
- встраиваемые классы могут использовать в качестве полей:
- базовые типы;
- коллекции базовых типов (с аннотацией @ElementCollection);
- другие встраиваемые классы;
- коллекции других встраиваемых классов (с аннотацией @ElementCollection);
- сущности;
- коллекции сущностей;
- сущность может использовать в качестве полей одиночные встраиваемые классы и коллекции встраиваемых классов;
- встраиваемые классы могут использоваться в качестве ключей и значений Map.
Требования к встраиваемым классам
- Должны соответствовать требованиям для сущностей (раздел 2.1 Java Persistence API), за исключением того, что у встраиваемых классов не ставится аннотация @Entity и может отсутствовать первичный ключ (@Id).
- Должны быть аннотированы @Embeddable.
Например, у нас может быть встраиваемый класс ClassA, который представляет собой композицию строкового и числового значений, и эти два поля будут добавлены в класс EntityA:
@Entity
public class EntityA {
@Id
@GeneratedValue
private int id;
@Embedded
private ClassA classARef;
.............
}
@Embeddable
public class ClassA {
private String myStr;
private int myInt;
.............
}

Так как мы можем встраивать классы в неограниченное количество других классов, то у каждого класса, содержащего встраиваемый класс, мы можем изменить названия полей из встраиваемого класса. Например, у класса Driver поля из встраиваемого класса Person будут изменены с name на driver_name и с age на driver_age:
@Embeddable
public class Person {
private String name;
private int age;
}
@Entity
public class Driver {
@Embedded
@AttributeOverrides({
@AttributeOverride( name ="name",
column = @Column(name ="driver_name")),
@AttributeOverride( name ="age",
column = @Column(name ="driver_age"))
})
private Person person;
...
}
Сущности, которые имеют встраиваемые классы, могут аннотировать поле или свойство аннотацией @Embedded, но не обязаны это делать.
Можно использовать для денормализации БД (ускорений запросов к БД).
Предыдущий вопрос: 5. Наследование Entity классов.
Следующий вопрос: 7. Что такое Mapped Superclass?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне