1. Обзор
В этом учебнике мы увидим, как мы можем сопоставить одну сущность, которая содержит встроенные свойства в единую таблицу базы данных.
Для этого мы будем использовать @Embeddable и @Embedded аннотации, предоставленные Java Persistence API (JPA) .
2. Контекст модели данных
Прежде всего, давайте определим таблицу под названием компания .
компания таблица будет хранить основную информацию, такую как название компании, адрес и телефон, а также информацию о контактном лице:
public class Company { private Integer id; private String name; private String address; private String phone; private String contactFirstName; private String contactLastName; private String contactPhone; // standard getters, setters }
Контактный человек, однако, кажется, что он должен быть абстрагирован в отдельный класс. Проблема в том, что мы не хотим создавать отдельную таблицу для этих деталей. Итак, давайте посмотрим, что мы можем сделать.
3. @Embeddable
JPA предоставляет @Embeddable аннотация для объявления о том, что класс будет встроен другими сущностями.
Давайте определим класс, чтобы абстрагироваться от данных контактного лица:
@Embeddable public class ContactPerson { private String firstName; private String lastName; private String phone; // standard getters, setters }
4. @Embedded
Аннотация JPA @Embedded используется для встраивания типа в другую сущность.
Давайте в следующий раз изменить наши Компания класс. Мы добавим аннотации JPA, а также изменим их контактПерсон вместо отдельных полей:
@Entity public class Company { @Id @GeneratedValue private Integer id; private String name; private String address; private String phone; @Embedded private ContactPerson contactPerson; // standard getters, setters }
В результате, у нас есть наша сущность Компания встраивание данных контактных лиц и отображение в единую таблицу базы данных.
У нас все еще есть еще одна проблема, хотя, и это как JPA будет сопоставить эти поля с столбцами баз данных.
5. Переопределение атрибутов
Дело в том, что наши поля назывались такими вещами, как контактПервыйНайм в нашей первоначальной Компания класса, а теперь первоеимя в нашем контактПерсон класс. Таким образом, JPA захочет сопоставить их с contact_first_name и first_name, соответственно.
Помимо того, что меньше, чем идеал, он будет на самом деле разорвать нас с нашей теперь дублируется телефонная столбец.
Таким образом, мы можем использовать @AttributeOverrides и @AttibuteOverride переопределить свойства столбца нашего встроенного типа.
Давайте добавим это к контактПерсон поле в нашем Компания сущность:
@Embedded @AttributeOverrides({ @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")), @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")), @AttributeOverride( name = "phone", column = @Column(name = "contact_phone")) }) private ContactPerson contactPerson;
Обратите внимание, что, поскольку эти аннотации выходят на поле, мы можем иметь различные переопределения для каждой прилагаемой сущности.
6. Заключение
В этом учебнике мы настроили сущность с некоторыми встроенными атрибутами и сопоставили их с той же таблицей данных, что и прилагаемая сущность. Для этого мы использовали @Embedded , @Embeddable , @AttributeOverrides и @AttributeOverride аннотации, предоставленные API сохранения Java.
Как всегда, исходный код примера доступен более на GitHub .