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, чтобы сделать это. Но я бы рекомендовал сделать все возможное, чтобы избежать использования нескольких полей. Они просто создают дополнительную работу.