Рубрики
Без рубрики

JPA @Embedded и @Embeddable

Узнайте о @Embeddable и @Embedded аннотациях, предоставленных API сохранения Java (JPA).

Автор оригинала: baeldung.

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 .