← Назад ко всем вопросам

Что такое Embeddable в JPA

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Зачем это нужно?

Использование @Embeddable позволяет:

  • Упрощать код: Вместо того чтобы дублировать набор полей в нескольких сущностях, вы можете создать один встраиваемый класс и использовать его везде, где это необходимо.
  • Повышать читаемость: Группировка связанных полей в отдельный класс делает код более организованным и понятным.
  • Повторное использование: Один и тот же встраиваемый класс может быть использован в нескольких сущностях, что уменьшает дублирование кода.

Как это работает?

Когда вы создаете класс с аннотацией @Embeddable, вы определяете набор полей, которые могут быть встроены в другие сущности. Эти поля становятся частью таблицы сущности, в которую они встроены.

Пример

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

import javax.persistence.Embeddable;
​
// Класс Address помечен как @Embeddable, что означает, что он может быть встроен в другие сущности.
@Embeddable
public class Address {
    private String street;
    private String city;
    private String state;
    private String zipCode;
​
    // Геттеры и сеттеры для каждого поля
    public String getStreet() {
        return street;
    }
​
    public void setStreet(String street) {
        this.street = street;
    }
​
    public String getCity() {
        return city;
    }
​
    public void setCity(String city) {
        this.city = city;
    }
​
    public String getState() {
        return state;
    }
​
    public void setState(String state) {
        this.state = state;
    }
​
    public String getZipCode() {
        return zipCode;
    }
​
    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
}

Теперь мы можем использовать Address в сущности Employee:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Embedded;
​
// Сущность Employee, которая будет храниться в базе данных.
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
​
    private String name;
​
    // Поле address является встраиваемым объектом, который будет храниться в той же таблице, что и Employee.
    @Embedded
    private Address address;
​
    // Геттеры и сеттеры для каждого поля
    public Long getId() {
        return id;
    }
​
    public void setId(Long id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public Address getAddress() {
        return address;
    }
​
    public void setAddress(Address address) {
        this.address = address;
    }
}

Как это связано с базой данных?

Когда Employee сохраняется в базе данных, поля из Address будут сохранены в той же таблице, что и Employee. Это означает, что таблица Employee будет иметь колонки для street, city, state и zipCode, наряду с другими полями Employee.

Использование @Embeddable и @Embedded позволяет эффективно управлять сложными структурами данных, сохраняя при этом простоту и читаемость кода.

Тема: Spring/Spring-экосистема
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки