Что такое 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 позволяет эффективно управлять сложными структурами данных, сохраняя при этом простоту и читаемость кода.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться