В этой статье блога мы рассмотрим концепцию встраиваемых сущностей в Java Persistence API (JPA) и узнаем, как эффективно использовать их в ваших приложениях. Встраиваемые сущности позволяют моделировать сложные структуры данных путем инкапсуляции нескольких полей в одну сущность. Мы рассмотрим различные методы и предоставим примеры кода, демонстрирующие их использование.
Содержание:
-
Что такое встраиваемые объекты?
-
Создание встраиваемых классов
-
Использование встраиваемых объектов в объектах
-
Сопоставление встраиваемых объектов
4.1. Встроенная аннотация
4.2. Аннотация AttributeOverride
4.3. Аннотация EmbeddedId -
Запрос встраиваемых объектов
-
Пример: использование встраиваемых объектов в банковском приложении
-
Вывод
-
Что такое встраиваемые объекты?
Встраиваемые объекты — это классы в JPA, которые используются для представления сложных структур данных. Они позволяют группировать несколько полей в одну сущность, которую затем можно встраивать в другие сущности. Встраиваемые сущности аналогичны объектам-значениям или компонентам в других средах объектно-реляционного сопоставления. -
Создание встраиваемых классов.
Чтобы создать встраиваемый класс, вы просто добавляете к обычному классу Java аннотацию@Embeddable. Вот пример встраиваемого класса, представляющего почтовый адрес:
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
// getters and setters
}
- Использование встраиваемых объектов в сущностях.
Чтобы использовать встраиваемый объект внутри другого объекта, вы можете просто объявить поле встраиваемого типа и добавить к нему аннотацию@Embedded. Вот пример объекта, представляющего клиента:
@Entity
public class Customer {
@Id
private Long id;
private String name;
@Embedded
private Address address;
// getters and setters
}
- Сопоставление встраиваемых объектов.
В зависимости от ваших требований существует несколько способов сопоставления встраиваемых объектов в 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;
// ...
}
- Запрос встраиваемых объектов.
Вы можете запрашивать встраиваемые объекты с помощью 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();
- Пример: использование встраиваемых объектов в банковском приложении:
Чтобы продемонстрировать использование встраиваемых объектов, давайте рассмотрим банковское приложение, в котором клиент может иметь несколько банковских счетов. Сущность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;
// ...
}
- Встраиваемые объекты в JPA предоставляют мощный механизм моделирования сложных структур данных. Они позволяют инкапсулировать связанные поля в единую сущность, улучшая организацию и читабельность кода. Понимая различные варианты сопоставления и методы запросов, вы можете эффективно использовать встраиваемые объекты в своих приложениях JPA.