[Java] Qué anotación debería usar: @IdClass o @EmbeddedId



Answers

Descubrí una instancia en la que tuve que usar EmbeddedId en lugar de IdClass. En este escenario, hay una tabla de unión que tiene columnas adicionales definidas. Intenté resolver este problema utilizando IdClass para representar la clave de una entidad que explícitamente representa las filas en la tabla de unión. No podría hacerlo funcionar de esta manera. Afortunadamente, "Java Persistence With Hibernate" tiene una sección dedicada a este tema. Una solución propuesta era muy similar a la mía, pero en su lugar usaba EmbeddedId. Modelé mis objetos después de aquellos en el libro que ahora se comporta correctamente.

Question

La especificación JPA (Java Persistence API) tiene 2 formas diferentes de especificar claves compuestas de entidad: @IdClass y @EmbeddedId .

Estoy utilizando ambas anotaciones en las entidades asignadas, pero resulta ser un gran desastre para las personas que no están muy familiarizadas con JPA .

Quiero adoptar solo una forma de especificar claves compuestas. ¿Cuál es realmente el mejor? ¿Por qué?




Hay tres estrategias para usar una clave primaria compuesta:

  • Marque como @Embeddable y agregue a su clase de entidad una propiedad normal para él, marcada con @Id .
  • Agregue a su clase de entidad una propiedad normal para él, marcada con @EmbeddedId .
  • Agregue propiedades a su clase de entidad para todos sus campos, @Id con @Id y marque su clase de entidad con @IdClass , suministrando la clase de su clase de clave primaria.

El uso de @Id con una clase marcada como @Embeddable es el enfoque más natural. La etiqueta @Embeddable se puede usar de todos modos para valores no @Embeddable clave primaria. Le permite tratar la clave primaria compuesta como una sola propiedad, y permite la reutilización de la clase @Embeddable en otras tablas.

El siguiente enfoque más natural es el uso de la etiqueta @EmbeddedId . Aquí, la clase de clave primaria no se puede usar en otras tablas, ya que no es una entidad @Embeddable , pero nos permite tratar la clave como un atributo único de alguna clase.

Finalmente, el uso de las anotaciones @IdClass y @Id nos permite mapear la clase de clave primaria compuesta usando las propiedades de la entidad correspondiente a los nombres de las propiedades en la clase de clave primaria. Los nombres deben corresponderse (no existe un mecanismo para anular esto), y la clase de clave primaria debe cumplir las mismas obligaciones que con las otras dos técnicas. La única ventaja de este enfoque es su capacidad para "ocultar" el uso de la clase de clave primaria desde la interfaz de la entidad que lo contiene. La anotación @IdClass toma un parámetro de valor del tipo Clase, que debe ser la clase que se utilizará como la clave primaria compuesta. Los campos que corresponden a las propiedades de la clase de clave primaria que se utilizarán se deben anotar con @Id .

Referencia: http://www.apress.com/us/book/9781430228509




La clave compuesta no debe tener una propiedad @EmbeddedId cuando se usa @EmbeddedId .




Links