Что такое Embedded сущности в Spring Data JPA?

«Что такое Embedded сущности в Spring Data JPA?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Embedded сущности (встраиваемые объекты) в Spring Data JPA — это объекты доменной модели, которые не являются самостоятельными сущностями, а представляют собой составную часть другой сущности. Их поля отображаются на колонки в таблице сущности-владельца. Реализуется через стандартные аннотации JPA @Embeddable и @Embedded.

Зачем использовать в Spring-приложении? Для улучшения структуры кода и соответствия принципам DDD (Domain-Driven Design), группируя логически связанные атрибуты в Value Objects.

Полный пример в Spring Boot приложении:

  1. 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;
        }
        // Геттеры
    }
  2. Сущность-владелец с 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 — для коллекции встраиваемых объектов (со своей таблицей).