Подтвердить что ты не робот

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

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

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

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

4b9b3361

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