JPA/Hibernate: что лучше для составных первичных ключей, реализаций @IdClass или @EmbeddedId и почему?
что лучше для составных первичных ключей JPA/Hibernate, реализаций @IdClass или @EmbeddedId и почему?
Это преднамеренно наивный вопрос. Я решил использовать @EmbeddedId (по какой-то причине), и я чувствую, что сделал неправильный выбор. Разбор разворота встроенного файла, который содержит свойства столбца, является избыточным и вполне подвержен ошибкам при кодировании.
Есть ли еще причины для и/или против другого? Является ли рекомендация JPA (spec)?
Ответы
Ответ 1
Как Паскаль написал здесь часть ответа:
Какую аннотацию следует использовать: @IdClass или @EmbeddedId
В конце концов, я считаю, что использование @IdClass
на практике намного проще, потому что вам нужно добавить имя свойства embeddedId
для разыскивания свойств PK, в то время как они не написаны для всех свойств, отличных от ПК.
Вам всегда нужно помнить, какие именно свойства являются частью ПК, а какие нет. Это затрудняет запись запросов JPQL неактивно.
Кроме того, AFAIK спецификация JPA 2.0 позволяет помещать @Id
в свойства @XToX
/@JoinColumn
/s и вводит аннотацию @MapsId
, так что сопоставление идентифицирующих отношений (так называемых производных идентификаторов в JPA) более естественным для реализации.
Ответ 2
Во-первых, если возможно, избегайте сложных идентификаторов любой ценой. Но если вам действительно нужно, я бы рекомендовал @EmbeddedId
.
@IdClass
в основном остается от EJB в 2.1 раза, чтобы упростить переход с BMP. В некоторых других редких случаях угол может быть лучше, чем @EmbeddedId
. Однако, как правило, @EmbeddedId
лучше и больше OO, поскольку он инкапсулирует концепцию os ключ намного лучше в объекте.
Вы можете использовать @AttributeOverride(s)
, если вам нужно в поле ключа.
Я не понимаю, почему вы считаете, что разыменование встроенного идентификатора является избыточным и подверженным ошибкам.
Ответ 3
я. Не забудьте использовать idclass для этого. Но я бы рекомендовал делать все возможное, чтобы избежать многопользовательских ключей. Они просто создают дополнительную работу.