java - primary - jpa multiple @id
JPA/Hibernate: ¿Qué es mejor para las claves primarias compuestas, las implementaciones @IdClass o @EmbeddedId y por qué? (3)
¿Qué es mejor para las claves primarias compuestas JPA / Hibernate, las implementaciones @IdClass o @EmbeddedId y por qué?
Esta es una pregunta intencionalmente ingenua. Decidí usar @EmbeddedId (por la razón que sea) y siento que tomé la decisión equivocada. La eliminación de referencias del embeddedId que contiene las propiedades de la columna es redundante y bastante propensa a errores al codificar.
¿Hay más razones para y / o contra el otro? ¿Es la recomendación de JPA (especificación)?
Como escribió Pascal, aquí hay parte de la respuesta:
Qué anotación debería usar: @IdClass o @EmbeddedId
Al final, creo que usar @IdClass
es mucho más fácil en la práctica, porque tiene que agregar el nombre de propiedad embeddedId
para eliminar las propiedades PK, mientras que estas no se escriben para todas las propiedades que no sean PK.
Siempre debe recordar exactamente qué propiedades forman parte de un PK y cuáles no. Eso complica la escritura de consultas JPQL innecesariamente.
Además, AFAIK la especificación JPA 2.0 le permite poner @Id
en @XToX
/ @JoinColumn
/ s propiedades e introduce la anotación @MapsId
, de modo que las relaciones de identificación de mapeo (también conocidos como identificadores derivados en JPA) son más naturales de implementar.
I. Recuerda usar idclass para hacerlo. Pero recomendaría hacer todo lo posible para evitar las claves de campo múltiple. Simplemente crean trabajo extra.
Primero, si es posible, evite las identificaciones compuestas a toda costa. Pero si realmente lo necesita, le recomendaría @EmbeddedId
.
@IdClass
es básicamente un @IdClass
de EJB 2.1 veces para facilitar la migración desde BMP. En algunos casos de otras esquinas raras, puede ser mejor que @EmbeddedId
también. Sin embargo, generalmente @EmbeddedId
es mejor y más OO ya que encapsula el concepto de clave mucho mejor en el objeto.
Es posible que desee utilizar @AttributeOverride(s)
si necesita en el campo clave.
No veo por qué crees que la eliminación de referencias del ID incorporado sea redundante y propensa a errores.