Considero que isso @EmbeddedId
provavelmente é mais detalhado, porque @IdClass
você não pode acessar todo o objeto de chave primária usando qualquer operador de acesso ao campo. Usando o que @EmbeddedId
você 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 @IdClass
e @EmbeddedId
é quando se trata de escrever HQL:
Com @IdClass
você escreve:
selecione e.name em Funcionário e
e com @EmbeddedId
você 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.
@IdClass
mesmo que prefira@EmbeddedId
na maioria das situações (soube disso em uma sessão de Antonio Goncalves. O que ele sugeriu é que poderíamos usar o@IdClass
caso 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@IdClass
nos dará uma forma como a nossa.