6. Что такое встраиваемый (Embeddable) класс? Какие требования JPA предъявляет к встраиваемым (Embeddable) классам?

6. Что такое встраиваемый (Embeddable) класс? Какие требования JPA предъявляет к встраиваемым (Embeddable) классам?

Unknown

Встраиваемый (Embeddable) класс Это класс, который не используется сам по себе, а только как часть одного или нескольких Entity классов. Hibernate называет эти классы компонентами. JPA называет их встраиваемыми. В любом случае, концепция одна и та же: композиция значений.

Встраиваемый класс помечается аннотацией @Embeddable.

Встраиваемый класс может быть встроен в несколько классов-сущностей, но встроенный объект с конкретным состоянием принадлежит исключительно владеющей им сущности и не может использоваться одновременно другими сущностями, он не является общим для нескольких сущностей. То есть, если класс Person с полями name и age встроен и в класс Driver, и в класс Baker, то у обоих последних классов появятся оба поля из класса Person. Но если у объекта Driver эти поля будут иметь значения "Иван" и "35", то эти же поля у объекта Baker могут иметь совершенно иные значения, никак не связанные с объектом Driver.

В целом, встраиваемый класс служит для того, чтобы выносить определение общих атрибутов для нескольких сущностей, можно считать что JPA просто встраивает в сущность вместо объекта такого класса те атрибуты, которые он содержит.

Особенности встраиваемых классов

  • все поля встраиваемого класса, даже коллекции, станут полями класса, в который происходит встраивание;
  • встраиваемые классы могут быть встроены в одну и ту же сущность несколько раз, нужно только поменять имена полей;
  • экземпляры встраиваемых классов, в отличие от экземпляров сущностей, не имеют собственного персистентного состояния, вместо этого они существуют только как часть состояния объекта, которому они принадлежат;
  • встраиваемые классы могут использовать в качестве полей:
  1. базовые типы;
  2. коллекции базовых типов (с аннотацией @ElementCollection);
  3. другие встраиваемые классы;
  4. коллекции других встраиваемых классов (с аннотацией @ElementCollection);
  5. сущности;
  6. коллекции сущностей;
  • сущность может использовать в качестве полей одиночные встраиваемые классы и коллекции встраиваемых классов;
  • встраиваемые классы могут использоваться в качестве ключей и значений 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?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне


Report Page