Я считаю, что @EmbeddedId
, вероятно, более многословно, поскольку с @IdClass
вы не можете получить доступ ко всему объекту первичного ключа, используя любой оператор доступа к полю. Используя @EmbeddedId
, вы можете сделать так:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Это дает четкое представление о полях, составляющих составной ключ, поскольку все они агрегированы в классе, доступ к которому осуществляется через оператор доступа к полю.
Еще одно отличие от @IdClass
и @EmbeddedId
в том, что когда речь идет о написании HQL:
С @IdClass
вы пишете:
select e.name from Employee e
и с @EmbeddedId
вы должны написать:
select e.employeeId.name from Employee e
Вы должны написать больше текста для того же запроса. Некоторые могут утверждать, что это отличается от более естественного языка, подобного тому, который пропагандирует IdClass
. Но в большинстве случаев правильное понимание из запроса того, что данное поле является частью составного ключа, имеет неоценимую помощь.