JPA/Hibernate и композитные ключи
Я сталкивался с некоторыми обсуждениями SO и другими постами (например, здесь, здесь и здесь), где использование составных первичных ключей с JPA описывается либо как нечто, чего следует избегать, если это возможно, либо как необходимость из-за устаревших баз данных или как наличие "волосатых" угловые чехлы. Поскольку мы разрабатываем новую базу данных с нуля и не имеем каких-либо проблем, которые следует учитывать, рекомендуется или, скажем, безопаснее, избегать составных первичных ключей с помощью JPA (Hibernate или EclipseLink?).
Мое собственное чувство состоит в том, что, поскольку движки JPA достаточно сложны и, конечно, как и все программное обеспечение, не без ошибок, может быть лучше перенести ненормализованные таблицы, чем терпеть ужас работы с ошибкой, связанной с составными первичными ключами (обоснование то, что числовые первичные ключи и внешние ключи из одного столбца являются простейшим вариантом использования для поддержки движками JPA, и поэтому оно должно быть как можно более безошибочным).
1 ответ
Я испробовал оба метода, и лично я предпочитаю избегать составных первичных ключей по нескольким причинам:
- Вы можете создать суперкласс, содержащий поле id, поэтому вам не придется беспокоиться об этом во всех ваших сущностях.
- Создание сущности становится намного проще
- JPA играет лучше в целом
- Ссылка на сущность становится проще. Например, хранение набора идентификаторов в наборе или указание одного идентификатора в строке запроса веб-страницы во многом упрощается, если использовать только одно число.
- Вы можете использовать один метод equals, указанный в суперклассе, который работает для всех объектов).
- Если вы используете JSF, вы можете сделать общий конвертер
- Проще указывать объекты при работе с клиентом БД
Но это приносит некоторые плохие части, а также:
- Небольшое количество денормализации
- Работа с незатронутыми объектами (если вы используете автоматически сгенерированные идентификаторы, что вам следует) в некоторых случаях может привести к проблемам, поскольку методы равенства и тому подобное требуют идентификатора для правильной работы