Я полагаю, что @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
необходимо записать больше текста для того же запроса. Некоторые могут утверждать, что это отличается от большего количества естественного языка как тот, продвинутый [1 110]. Но большинство времен, понимая прямо от запроса, что данное поле является частью составного ключа, имеет неоценимую справку.
Я обнаружил экземпляр, где я должен был использовать EmbeddedId вместо IdClass. В этом сценарии существует объединяющая таблица, которой определили дополнительные столбцы. Я попытался решить это использование задач IdClass для представления ключа объекта, который явно представляет строки в объединяющей таблице. Я не мог получить его прокладывание себе путь. К счастью "Персистентность Java С В спящем режиме", выделили раздел этой теме. Одно предлагаемое решение было очень похоже на мой, но оно использовало EmbeddedId вместо этого. Я смоделировал свои объекты после тех в книге, она теперь ведет себя правильно.