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