2010-08-05 7 views
34

Me gustaría entender mejor las diferencias entreJPA: Al elegir varios valores Asociación vs. elemento de colección de asignaciones de

(1) un tradicional multivalor Relación/Asociación

@Entity -> @OneToMany -> @Entity 

y

(2) JPA2 Colección de tipos incrustados (y básicos)

@Entity -> @ElementCollection -> @Embeddable 

Veo las diferencias sintácticas, pero me pregunto si también hay implicaciones de rendimiento. Bajo el capó, la implementación de la base de datos se ve muy similar.

Intuitivamente, normalmente usaría el @ElementCollection para escenarios de composición. Pero incluso eso se siente muy similar como CascadeType=DELETE.

¿Me estoy perdiendo la esencia aquí? ¿Es uno más eficiente que el otro para ciertos propósitos?

Gracias, J.

Respuesta

16

Intuitivamente, que normalmente usaría la @ElementCollection para escenarios de composición. Pero incluso eso se siente muy parecido a CascadeType = DELETE

Son similares, con algunas diferencias leves. La página ElementCollection del Java Persistence wikilibro resume bastante bien:

Emdedded Collections

Un ElementCollection mapeo puede ser utilizado para definir una colección de objetos Embeddable. Esto no es un uso típico de Embeddable objetos como los objetos no son incrustado en la mesa del objeto fuente, pero almacenada en una tabla de recogida por separado . Esto es similar a OneToMany, excepto que el objeto de destino es Embeddable en su lugar de Entity. Esto permite que las colecciones de objetos simples sean fácilmente definidas, sin requerir los objetos simples para definir un mapeo inverso Id o ManyToOne . ElementCollection puede también temporalmente las correlaciones, o mesa para su colección, lo que puede tener referencia múltiples entidades de la misma clase Embeddable, pero tienen cada tienda sus objetos dependientes en un tabla separada.

Las limitaciones del uso de una ElementCollection en lugar de un OneToMany es que el objetivo objetos no se puede consultar, persistido, fusionado independientemente de su objeto padre. Son objetos estrictamente privados (dependientes), lo mismo que un mapeo Embedded. Su opción no es cascade en un ElementCollection, los objetos de destino siempre se conservan, fusionados, eliminados con sus padres. ElementCollection aún puede usar un tipo de búsqueda y el valor predeterminado es LAZY el igual que otras asignaciones de colección.

Ver también

8

especificación JPA está claro

incrustables no se puede consultar, persistió, se fusionó con independencia de su objeto padre. Son propiedad privada estrictamente (dependiente) objetos

Debe utilizar cuidadosamente porque su vida útil está limitada por el tiempo de vida de la instancia de la entidad propietaria. Así que si persisten/fusión/eliminar la instancia entidad propietaria, todos sus incrustables casos se conservará/fusionada/removidos

suponga que hacer algo como

/** 
    * Let's suppose owning contains SIX embeddables instances 
    */ 
Owning owning = manager.find(Owining.class, owningId); 

Así que su modificar simplemente su entidad propietaria en la capa de vista y envíe sus cambios. Recuperar su entidad propietaria utilizando

/** 
    * Usually your web framework Takes care of binding your submitted data 
    */ 
Owning owning = new Owning(); 
owning.setProperty(request.getParameter("property")); 

A continuación, puede combinar los datos presentados y A creer las instancias incrustables se almacenan en la base de datos todavía. Bueno, veamos

Como se muestra arriba que acaba de recuperar (o su marco web) ¿Posee propiedades, verdad ??? Por lo tanto, su owning.getElementList() está vacío. Como owning.getElementList() está vacío, JPA eliminará todas sus instancias incrustables. Mantén esto en mente.

Por lo general, una clase incrustable no tiene ninguna relación con su entidad propietaria. Y al utilizar un conjunto de elementos incrustables, JPA siempre seleccione antes de guardar/actualizar porque necesita comparar uno por uno utilizando su método igual. Por lo tanto, necesita un consistente en la implementación cuando usa una colección de conjuntos.

Here puede ver su homólogo en Hibernate.

+0

@Jan Aquí http://stackoverflow.com/questions/2440806/uml-class-relationships/2441251#2441251 Eche un vistazo a ** composition ** y verá donde @ElementCollection se ajusta mejor –

Cuestiones relacionadas