JPA/Hibernate: что лучше для составных первичных ключей, реализации @IdClass или @EmbeddedId и почему?

что лучше для составных первичных ключей JPA/Hibernate, реализации @IdClass или @EmbeddedId и почему?

Это намеренно наивный вопрос. Я решил использовать @EmbeddedId (по какой-то причине) и чувствую, что сделал неправильный выбор. Разыменование встроенного идентификатора, содержащего свойства столбца, является избыточным и довольно подверженным ошибкам при кодировании.

Есть ли еще причины за и/или против другого? Является ли это рекомендацией JPA (спецификация)?


person Kawu    schedule 26.10.2010    source источник
comment
Похоже, что это так. Но он не перечисляет больше причин.   -  person Kawu    schedule 27.10.2010


Ответы (3)


Во-первых, по возможности избегайте составных идентификаторов любой ценой. Но если очень нужно, то я бы порекомендовал @EmbeddedId.

@IdClass в основном является остатком от EJB 2.1 раз, чтобы упростить миграцию с BMP. В некоторых других редких угловых случаях это может быть лучше, чем @EmbeddedId. Однако, как правило, @EmbeddedId лучше и более объектно-ориентированный, поскольку он намного лучше инкапсулирует концепцию ключа в объекте.

Вы можете использовать @AttributeOverride(s), если вам нужно в ключевом поле.

Я не понимаю, почему вы думаете, что разыменование встроенного идентификатора избыточно и подвержено ошибкам.

person Victor Stafusa    schedule 27.12.2010
comment
Да, вы правы с последней фразой. Если бы кто-то использовал синтаксис JPA 2.0, в классе сущностей не было бы никаких избыточных полей, поэтому вам пришлось бы всегда разыменовывать столбцы соединения, что кажется предпочтительным для всех 4 вариантов составного ключа JPA 1.0 @IdClass, JPA 1.0 @EmbeddedId, JPA 2.0 @IdClass и JPA 2.0 @EmbeddedId. - person Kawu; 01.01.2011
comment
Можете ли вы объяснить, почему составные идентификаторы плохи? - person Stefan Falk; 29.06.2015

Как писал Паскаль, вот часть ответа:

Какую аннотацию следует использовать: @IdClass или @EmbeddedId

В конце концов, я считаю, что использование @IdClass на практике намного проще, потому что вам нужно добавить имя свойства embeddedId для разыменования свойств PK, хотя они не написаны для всех свойств, не относящихся к PK.

Вы всегда должны точно помнить, какие свойства являются частью ПК, а какие нет. Это излишне усложняет написание запросов JPQL.

Кроме того, насколько я знаю, спецификация JPA 2.0 позволяет вам помещать @Id в свойства @XToX/@JoinColumn/s и вводит аннотацию @MapsId, так что отображение идентифицирующих отношений (также известных как производные идентификаторы в JPA) более естественно для реализации.

person Kawu    schedule 27.10.2010

I. Не забудьте использовать для этого idclass. Но я бы порекомендовал сделать все возможное, чтобы избежать ключей с несколькими полями. Они просто создают дополнительную работу.

person drekka    schedule 10.12.2010
comment
Дал +1, потому что это заставило нас пересмотреть использование композитного ПК и прийти к выводу, что без них было бы намного лучше. - person Erikson; 06.03.2015
comment
Иногда — особенно при работе с устаревшей схемой — единственный способ правильно отобразить объект — использовать составные ПК. Конечно, при разработке новой схемы их лучше избегать (по возможности). - person snorbi; 12.05.2017