Ответ
Embedded сущности (встраиваемые объекты) в Spring Data JPA — это объекты доменной модели, которые не являются самостоятельными сущностями, а представляют собой составную часть другой сущности. Их поля отображаются на колонки в таблице сущности-владельца. Реализуется через стандартные аннотации JPA @Embeddable и @Embedded.
Зачем использовать в Spring-приложении? Для улучшения структуры кода и соответствия принципам DDD (Domain-Driven Design), группируя логически связанные атрибуты в Value Objects.
Полный пример в Spring Boot приложении:
-
Embeddable-класс (Value Object):
@Embeddable public class Address { @Column(nullable = false) // Аннотации JPA работают и здесь private String city; private String street; private String zipCode; // Обязательно: конструктор без аргументов (JPA requirement) public Address() {} // Конструктор со всеми аргументами для удобства public Address(String city, String street, String zipCode) { this.city = city; this.street = street; this.zipCode = zipCode; } // Геттеры } -
Сущность-владелец с Spring Data JPA репозиторием:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; @Embedded // Указывает, что поле является встраиваемым объектом private Address homeAddress; // Spring Data JPA автоматически сохранит поля Address в таблице `users` // Геттеры, сеттеры, конструкторы }// Spring Data JPA репозиторий будет работать с User, включая Address @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByHomeAddressCity(String city); // Поддерживаются запросы по вложенным свойствам! }
Ключевые моменты для Spring-разработчика:
- Spring Data JPA полностью поддерживает работу с
@Embeddableклассами. - Можно создавать производные запросы (Query Methods) по полям вложенного объекта (как в примере выше).
- Используется для:
- Группировки атрибутов (Адрес, Полное имя, Денежная сумма).
- Следования принципу Composition over Inheritance.
- Упрощения маппинга сложных типов данных (например, JPA
AttributeConverterможет использоваться внутри@Embeddable).
- Не путать с
@ElementCollection:@Embeddable— для одиночного встраивания,@ElementCollection— для коллекции встраиваемых объектов (со своей таблицей).