Создание составного ключа через JPA и Hibernate в Java
Быстрый ответ
Стандартным способом сопоставления составного ключа в JPA является использование аннотации @Embeddable
для класса ключа и @EmbeddedId
— для главной сущности. Вот наглядный пример:
@Embeddable
public class CompositeKey implements Serializable {
private Long partOne;
private Long partTwo;
// стандартные геттеры и сеттеры
// реализация методов equals и hashCode
}
@Entity
public class MyEntity {
@EmbeddedId
private CompositeKey id;
// остальные поля нашей сущности...
}
Данная методология гарантирует уникальность возможных вариаций экземпляров.
Рассматриваем @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.
@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;
}
Полезные материалы
- Сопоставление составных ключей в JPA – Руководство LogicBig — подробное руководство обработке составных первичных ключей.
- Java persistence API – Руководство Vogella — подробное описание работы с аннотациями
@Embeddable
и@EmbeddedId
. - IdClass (Java(TM) EE 7 API Specification) — документация по
@IdClass
в рамках спецификации Java EE 7. - Понимание JPA, Часть 2: Установление отношений в JPA – IBM Developer — изучение взаимосвязи отношений в JPA и их работы с ключами.
- Недавние вопросы с тэгом 'composite-primary-key+jpa' – Stack Overflow — примеры решений задач по сопоставлению составных ключей на Stack Overflow.