primary llaves llave entidades compuestas compuesta column clave anotacion java hibernate

java - llaves - Diferencia usando @Id y @EmbeddedId para una clave compuesta



llaves compuestas spring boot (2)

Es demasiado tarde para esta respuesta, pero en caso de que ayude.

Me referí a las anotaciones de Hibernate y las anotaciones de Hiberate 3.5, por lo que existe la diferencia de que con @EmbeddedId puede omitir la anotación de la clase de entidad @Embeddable pero con @Id es necesario.

Intenté usar @Id sin @Embeddable que da una excepción:

org.hibernate.mapping.SimpleValue no se puede convertir a org.hibernate.mapping.Component

Solo esto y ninguna información adicional como el campo o el nombre de la clase.

Bueno este comportamiento es a partir de Hibernate 4; No sé sobre otros proveedores de JPA. Voy a probar algunos y actualizar la publicación en consecuencia si hay más hallazgos.

¡Espero que esto ayude a alguien!

He creado una entidad que usa @Id para apuntar a una clave compuesta de @Embeddable. Todo lo que creo funciona bien como es. Sin embargo, después de cambiar @Id a @EmbeddedId, todo sigue funcionando bien, por lo que puedo decir.

Antes de:

@Entity public final class MyEntity { private CompoundKey id; @Id public CompoundKey getId() { return id; } public void setId(CompoundKey id) { this.id = id; }

Después:

@Entity public final class MyEntity { private CompoundKey id; @EmbeddedId public CompoundKey getId() { return id; } public void setId(CompoundKey id) { this.id = id; }

¿Hay alguna diferencia entre usar las anotaciones @Id y @EmbeddedId cuando se hace referencia a una clave compuesta?


Estoy realmente sorprendido de que la versión "antes" esté funcionando. De acuerdo con la especificación, la forma correcta de asignar su clave compuesta Embeddable es la versión "después" . Citando la especificación JPA 1.0:

2.1.4 Claves primarias e identidad de la entidad

Cada entidad debe tener una clave primaria.

La clave principal debe definirse en la entidad que es la raíz de la jerarquía de la entidad o en una superclase asignada de la jerarquía de la entidad. La clave principal debe definirse exactamente una vez en una jerarquía de entidades.

Una clave primaria simple (es decir, no compuesta) debe corresponder a un único campo o propiedad persistente de la clase de entidad. La anotación de Id se utiliza para denotar una clave principal simple. Ver apartado 9.1.8.

Una clave primaria compuesta debe corresponder a un solo campo o propiedad persistente o a un conjunto de dichos campos o propiedades como se describe a continuación. Se debe definir una clase de clave primaria para representar una clave primaria compuesta. Las claves primarias compuestas suelen surgir cuando se asignan desde bases de datos heredadas cuando la clave de la base de datos consta de varias columnas. Las anotaciones de EmbeddedId y IdClass se utilizan para denotar claves primarias compuestas. Ver secciones 9.1.14 y 9.1.15.

La clave principal (o campo o propiedad de una clave primaria compuesta) debe ser uno de los siguientes tipos: cualquier tipo primitivo de Java; cualquier tipo de envoltorio primitivo; java.lang.String ; java.util.Date ; java.sql.Date . En general, sin embargo, los tipos numéricos aproximados (por ejemplo, tipos de punto flotante) nunca deben usarse en claves primarias. Las entidades cuyas claves primarias usan tipos distintos a estos no serán portátiles. Si se usan claves primarias generadas, solo los tipos integrales serán portátiles. Si java.util.Date se usa como un campo o propiedad de clave principal, el tipo temporal debe especificarse como DATE.

...

Y después:

9.1.14 Anotación de EmbeddedId

La anotación de EmbeddedId se aplica a un campo o propiedad persistente de una clase de entidad o superclase asignada para denotar una clave primaria compuesta que es una clase incrustable. La clase encajable se debe anotar como Embeddable .

Solo debe haber una anotación de EmbeddedId y ninguna anotación de Id cuando se utiliza la anotación de EmbeddedId .