Создание составного ключа через JPA и Hibernate в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Стандартным способом сопоставления составного ключа в JPA является использование аннотации @Embeddable для класса ключа и @EmbeddedId — для главной сущности. Вот наглядный пример:

Java
Скопировать код
@Embeddable
public class CompositeKey implements Serializable {
    private Long partOne;
    private Long partTwo;
    // стандартные геттеры и сеттеры
    // реализация методов equals и hashCode
}

@Entity
public class MyEntity {
    @EmbeddedId
    private CompositeKey id;
    // остальные поля нашей сущности...
}

Данная методология гарантирует уникальность возможных вариаций экземпляров.

Кинга Идем в IT: пошаговый план для смены профессии

Рассматриваем @Embeddable и @EmbeddedId подробнее

Класс CompositeKey должен обязательно буть опубликован и реализовать спецификацию Serializable. К тому же, он должен объявлять общедоступный конструктор без каких-либо аргументов. Таковы условия для корректного взаимодействия с Hibernate.

При организации работы с ключами, крайне важно реализовать методы equals() и hashCode(). Именно от них зависит корректность работы всей JPA.

Запросы в JPQL при использовании @EmbeddedId будут немного отличаться, теперь вам придется обрабатывать вложенные объекты.

Практические преимущества и особенности

Использование @EmbeddedId эффективно с точки зрения представления сущности в объектной модели и работы с двунаправленными отношениями. Однако, при внедрении ленивой загрузки в Hibernate следует быть аккуратными: это может повлиять на сравнение объектов. Удачно реализованный equals() устойчив к используемым прокси-классам.

Визуализация

Сопоставление составного ключа с JPA и Hibernate ассоциируется с подобием конструктора, где:

  • Блок 1 (🧱🏷️): {field1: 'ValueA', field2: 'ValueB'}
  • Блок 2 (🧱🏷️): {field1: 'ValueC', field2: 'ValueD'}

Применив @EmbeddedId или @IdClass, мы собираем конструктор, создавая уникальную структуру:

  • Башня из составного ключа (🏢🧱🧱): [Блок 1 + Блок 2]

Стабильное "здание" — наша сущность с составным ключом, — возможно построить только при аккуратной укладке каждого "блока".

Работа со составными ключами на практике

Автоматическое сопоставление при помощи сред разработки

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

Реализация принципа Лисков в equals()

Следуйте принципу подстановки Лисков при реализации equals(). Это поможет поддерживать целостность иерархии классов, особенно важно это при наследовании и работе со составными ключами.

Сопоставимость отношений посредством @ManyToOne и @JoinColumns

При наличии отношений между сущностью, использующей составной ключ, и другими сущностями применяют аннотации @ManyToOne и @JoinColumns. Они облегчают связывание объектов в ORM.

Java
Скопировать код
@Embeddable
public class CompositeKey implements Serializable {
    //...

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "FOREIGN_KEY_PART1", referencedColumnName = "ID_PART1"),
        @JoinColumn(name = "FOREIGN_KEY_PART2", referencedColumnName = "ID_PART2")
    })
    private OtherEntity relatedEntity;
}

Полезные материалы

  1. Сопоставление составных ключей в JPA – Руководство LogicBig — подробное руководство обработке составных первичных ключей.
  2. Java persistence API – Руководство Vogella — подробное описание работы с аннотациями @Embeddable и @EmbeddedId.
  3. IdClass (Java(TM) EE 7 API Specification) — документация по @IdClass в рамках спецификации Java EE 7.
  4. Понимание JPA, Часть 2: Установление отношений в JPA – IBM Developer — изучение взаимосвязи отношений в JPA и их работы с ключами.
  5. Недавние вопросы с тэгом 'composite-primary-key+jpa' – Stack Overflow — примеры решений задач по сопоставлению составных ключей на Stack Overflow.