JPA/Hibernate и композитные ключи

Я сталкивался с некоторыми обсуждениями SO и другими постами (например, здесь, здесь и здесь), где использование составных первичных ключей с JPA описывается либо как нечто, чего следует избегать, если это возможно, либо как необходимость из-за устаревших баз данных или как наличие "волосатых" угловые чехлы. Поскольку мы разрабатываем новую базу данных с нуля и не имеем каких-либо проблем, которые следует учитывать, рекомендуется или, скажем, безопаснее, избегать составных первичных ключей с помощью JPA (Hibernate или EclipseLink?).

Мое собственное чувство состоит в том, что, поскольку движки JPA достаточно сложны и, конечно, как и все программное обеспечение, не без ошибок, может быть лучше перенести ненормализованные таблицы, чем терпеть ужас работы с ошибкой, связанной с составными первичными ключами (обоснование то, что числовые первичные ключи и внешние ключи из одного столбца являются простейшим вариантом использования для поддержки движками JPA, и поэтому оно должно быть как можно более безошибочным).

1 ответ

Решение

Я испробовал оба метода, и лично я предпочитаю избегать составных первичных ключей по нескольким причинам:

  • Вы можете создать суперкласс, содержащий поле id, поэтому вам не придется беспокоиться об этом во всех ваших сущностях.
  • Создание сущности становится намного проще
  • JPA играет лучше в целом
  • Ссылка на сущность становится проще. Например, хранение набора идентификаторов в наборе или указание одного идентификатора в строке запроса веб-страницы во многом упрощается, если использовать только одно число.
  • Вы можете использовать один метод equals, указанный в суперклассе, который работает для всех объектов).
  • Если вы используете JSF, вы можете сделать общий конвертер
  • Проще указывать объекты при работе с клиентом БД

Но это приносит некоторые плохие части, а также:

  • Небольшое количество денормализации
  • Работа с незатронутыми объектами (если вы используете автоматически сгенерированные идентификаторы, что вам следует) в некоторых случаях может привести к проблемам, поскольку методы равенства и тому подобное требуют идентификатора для правильной работы
Другие вопросы по тегам