Я вважаю, що @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нам буде надано шлях.