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