Considero que isso @EmbeddedIdprovavelmente é mais detalhado, porque @IdClassvocê não pode acessar todo o objeto de chave primária usando qualquer operador de acesso ao campo. Usando o que @EmbeddedIdvocê pode fazer assim:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
Isso fornece uma noção clara dos campos que compõem a chave composta, porque todos eles são agregados em uma classe que é acessada através de um operador de acesso a campos.
Outra diferença com @IdClasse @EmbeddedIdé quando se trata de escrever HQL:
Com @IdClassvocê escreve:
selecione e.name em Funcionário e
e com @EmbeddedIdvocê tem que escrever:
selecione e.employeeId.name em Funcionário e
Você precisa escrever mais texto para a mesma consulta. Alguns podem argumentar que isso difere de uma linguagem mais natural como a promovida por IdClass. Mas na maioria das vezes, entender diretamente a partir da consulta que um determinado campo faz parte da chave composta é uma ajuda inestimável.
@IdClassmesmo que prefira@EmbeddedIdna maioria das situações (soube disso em uma sessão de Antonio Goncalves. O que ele sugeriu é que poderíamos usar o@IdClasscaso de o composto classe de chave não é acessível ou vem de outro módulo ou legado código onde não podemos adicionar uma anotação .Em esses cenários@IdClassnos dará uma forma como a nossa.