Комплексное руководство по использованию встраиваемых объектов в JPA

В этой статье блога мы рассмотрим концепцию встраиваемых сущностей в Java Persistence API (JPA) и узнаем, как эффективно использовать их в ваших приложениях. Встраиваемые сущности позволяют моделировать сложные структуры данных путем инкапсуляции нескольких полей в одну сущность. Мы рассмотрим различные методы и предоставим примеры кода, демонстрирующие их использование.

Содержание:

  1. Что такое встраиваемые объекты?

  2. Создание встраиваемых классов

  3. Использование встраиваемых объектов в объектах

  4. Сопоставление встраиваемых объектов
    4.1. Встроенная аннотация
    4.2. Аннотация AttributeOverride
    4.3. Аннотация EmbeddedId

  5. Запрос встраиваемых объектов

  6. Пример: использование встраиваемых объектов в банковском приложении

  7. Вывод

  8. Что такое встраиваемые объекты?
    Встраиваемые объекты — это классы в JPA, которые используются для представления сложных структур данных. Они позволяют группировать несколько полей в одну сущность, которую затем можно встраивать в другие сущности. Встраиваемые сущности аналогичны объектам-значениям или компонентам в других средах объектно-реляционного сопоставления.

  9. Создание встраиваемых классов.
    Чтобы создать встраиваемый класс, вы просто добавляете к обычному классу Java аннотацию @Embeddable. Вот пример встраиваемого класса, представляющего почтовый адрес:

@Embeddable
public class Address {
    private String street;
    private String city;
    private String zipCode;
    // getters and setters
}
  1. Использование встраиваемых объектов в сущностях.
    Чтобы использовать встраиваемый объект внутри другого объекта, вы можете просто объявить поле встраиваемого типа и добавить к нему аннотацию @Embedded. Вот пример объекта, представляющего клиента:
@Entity
public class Customer {
    @Id
    private Long id;
    private String name;
    @Embedded
    private Address address;
    // getters and setters
}
  1. Сопоставление встраиваемых объектов.
    В зависимости от ваших требований существует несколько способов сопоставления встраиваемых объектов в JPA.

4.1. Встроенная аннотация:
Аннотация @Embeddedиспользуется для указания того, что поле следует рассматривать как встроенный объект. Если имя поля соответствует имени встраиваемого класса, дополнительные аннотации не требуются. В противном случае вы можете использовать аннотацию @AttributeOverrideдля указания сопоставления.

@Entity
public class Customer {
    // ...
    @Embedded
    @AttributeOverride(name = "zipCode", column = @Column(name = "postal_code"))
    private Address address;
    // ...
}

4.2. АннотацияAttributeOverride:
Аннотация @AttributeOverrideпозволяет переопределить сопоставление поля по умолчанию во встроенном объекте.

@Entity
public class Customer {
    // ...
    @Embedded
    @AttributeOverride(name = "zipCode", column = @Column(name = "postal_code"))
    private Address address;
    // ...
}

4.3. Аннотация EmbeddedId:
Если ваш встраиваемый объект служит первичным ключом объекта, вы можете использовать аннотацию @EmbeddedId, чтобы указать это.

@Entity
public class Order {
    @EmbeddedId
    private OrderId id;
    // ...
}
@Embeddable
public class OrderId {
    private Long orderId;
    private Long customerId;
    // ...
}
  1. Запрос встраиваемых объектов.
    Вы можете запрашивать встраиваемые объекты с помощью JPQL (язык постоянных запросов Java) или Criteria API, аналогично запросу обычных объектов. Вот пример использования JPQL:
TypedQuery<Customer> query = entityManager.createQuery(
    "SELECT c FROM Customer c WHERE c.address.city = :city", Customer.class);
query.setParameter("city", "New York");
List<Customer> customers = query.getResultList();
  1. Пример: использование встраиваемых объектов в банковском приложении:
    Чтобы продемонстрировать использование встраиваемых объектов, давайте рассмотрим банковское приложение, в котором клиент может иметь несколько банковских счетов. Сущность Customerможет встраивать сущность Accountдля представления данных банковского счета клиента.
@Entity
public class Customer {
    @Id
    private Long id;
    private String name;
    @Embedded
    private Account account;
    // ...
}
@Embeddable
public class Account {
    private String accountNumber;
    private String bankName;
    // ...
}
  1. Встраиваемые объекты в JPA предоставляют мощный механизм моделирования сложных структур данных. Они позволяют инкапсулировать связанные поля в единую сущность, улучшая организацию и читабельность кода. Понимая различные варианты сопоставления и методы запросов, вы можете эффективно использовать встраиваемые объекты в своих приложениях JPA.