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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам