Hasta donde sé, si su PK compuesto contiene FK, es más fácil y sencillo de usar @IdClass
Con @EmbeddedId
usted debe definir el mapeo para su columna FK dos veces, @Embeddedable
una vez y una vez, es decir, @ManyToOne
dónde @ManyToOne
debe ser de solo lectura ( @PrimaryKeyJoinColumn
) porque no puede tener una columna configurada en dos variables (posibles conflictos).
Por lo tanto, debe configurar su FK con un tipo simple @Embeddedable
.
En el otro sitio, el uso de @IdClass
esta situación se puede manejar mucho más fácilmente, como se muestra en las claves principales a través de las relaciones OneToOne y ManyToOne :
Ejemplo de anotación de identificación ManyToOne JPA 2.0
...
@Entity
@IdClass(PhonePK.class)
public class Phone {
@Id
private String type;
@ManyToOne
@Id
@JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
private Employee owner;
...
}
Ejemplo de clase de id JPA 2.0
...
public class PhonePK {
private String type;
private long owner;
public PhonePK() {}
public PhonePK(String type, long owner) {
this.type = type;
this.owner = owner;
}
public boolean equals(Object object) {
if (object instanceof PhonePK) {
PhonePK pk = (PhonePK)object;
return type.equals(pk.type) && owner == pk.owner;
} else {
return false;
}
}
public int hashCode() {
return type.hashCode() + owner;
}
}
@IdClass
, aunque lo prefiero@EmbeddedId
en la mayoría de las situaciones (Tengo que saber esto de una sesión de Antonio Goncalves. Lo que sugirió es que podríamos usar el@IdClass
en caso de que el compuesto No se puede acceder a la clase de clave o viene de otro módulo o código heredado donde no podemos agregar una anotación. En esos escenarios@IdClass
nos dará una forma de hacerlo . ”