Я вважаю, що @EmbeddedId
це, мабуть, більш багатослівно, оскільки з @IdClass
вами ви не можете отримати доступ до всього об'єкта первинного ключа за допомогою будь-якого оператора доступу до поля. Використовуючи інструменти, @EmbeddedId
ви можете зробити так:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Це дає чітке уявлення про поля, які складають складний ключ, оскільки всі вони об'єднані в клас, до якого звертається через оператор доступу до поля.
Ще одна відмінність з @IdClass
і в @EmbeddedId
тому, коли мова йде про написання HQL:
З @IdClass
вами пишіть:
виберіть e.name від Співробітник e
і з @EmbeddedId
вами треба написати:
виберіть e.employeeId.name від Співробітник e
Вам потрібно написати більше тексту для того ж запиту. Деякі можуть стверджувати, що це відрізняється від більш природної мови, як тієї, яку пропагує IdClass
. Але більшість випадків розуміння прямо з запиту про те, що дане поле є частиною складеного ключа, є безцінною допомогою.
@IdClass
хоча я віддаю перевагу@EmbeddedId
в більшості ситуацій (Маю це знати з сеансу Антоніо Гонкальвеса. Що він запропонував, ми можемо використовувати цей@IdClass
випадок у випадку, якщо композитний Клас клавіш недоступний або надходить з іншого модуля чи застарілого коду, куди ми не можемо додати анотацію. У таких сценаріях@IdClass
нам буде надано шлях.