2010-10-26 17 views
24

¿Qué es mejor para las claves primarias compuestas JPA/Hibernate, las implementaciones @IdClass o @EmbeddedId y por qué?JPA/Hibernate: ¿Qué es mejor para las claves primarias compuestas, 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 alguna otra razón para y/o contra la otra? ¿Es la recomendación de JPA (especificación)?

+0

posible duplicado de [Qué anotación debo usar: @IdClass o @EmbeddedId] (http://stackoverflow.com/questions/212350/which-anotation-should-i-use-idclass-or-embeddedid) –

+0

It parece ser. Pero no enumera más razones. – Kawu

+0

El manual de Hibernate desaconseja @IdClass por razones desconocidas: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1112 ¿Quizás alguien que pueda aclarar esto? – Kawu

Respuesta

7

Como Pascal escribió aquí está parte de la respuesta:

Which annotation should I use: @IdClass or @EmbeddedId

Al final, creo que el uso de @IdClass es mucho más fácil en la práctica, ya que hay que añadir el nombre de embeddedId propiedad a propiedades eliminar la referencia de PK, mientras que estos no están escritos para todas las propiedades que no sean de PK.

Siempre debe recordar exactamente qué propiedades forman parte de un PK y cuáles no. Eso complica la escritura de consultas JPQL innecesariamente.

También, AFAIK la especificación JPA 2.0 le permite poner @Id en @XToX/@JoinColumn/s propiedades e introduce la anotación @MapsId, por lo que la cartografía identificación de las relaciones (identificadores alias derivados en JPA) son más naturales de implementar.

2

I. Recuerde usar idclass para hacerlo. Pero recomendaría hacer todo lo posible para evitar las claves de campo múltiple. Simplemente crean trabajo extra.

+0

Dio +1 porque nos hizo reevaluar usando PK compuesto y hemos llegado a la conclusión de que estaríamos mucho mejor sin ellos. – Erikson

+0

A veces, especialmente cuando se trabaja con un esquema heredado, la única forma de asignar correctamente una entidad es mediante el uso de PK compuestas. Por supuesto, al diseñar un nuevo esquema, es mejor evitarlos (si es posible). – snorbi

8

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 remanente de EJB 2.1 veces para facilitar la migración desde BMP. En algunos casos de esquina raros, también puede ser mejor que @EmbeddedId. Sin embargo, generalmente @EmbeddedId es mejor y más OO, ya que encapsula el concepto de la clave mucho mejor en el objeto.

Es posible que desee utilizar @AttributeOverride(s) si necesita en el campo clave.

No veo por qué cree que la eliminación de referencias del id. Incorporado es redundante y propensa a errores.

+0

Sí, tiene razón con su última oración. Si se utilizara la sintaxis de JPA 2.0, no habría campos redundantes en la clase de entidad, por lo que siempre tendría que eliminar la referencia de las columnas de combinación, lo que parece ser preferible para las 4 variables compuestas JPA 1.0 @IdClass, JPA 1.0 @EmbeddedId, JPA 2.0 @IdClass y JPA 2.0 @EmbeddedId. – Kawu

+1

¿Puede explicar por qué las identificaciones compuestas son malas? – displayname

Cuestiones relacionadas