Я считаю, что @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
нам будет проще наш.