¿Diferencia entre @OneToMany y @ElementCollection?

129

¿Cuál es la diferencia entre usar una @OneToManyy @ElementCollectionanotación ya que tanto el trabajo en la relación de uno a muchos?

n_g
fuente
3
En pocas palabras, @ElementCollection se usa cuando la existencia de la entidad secundaria no tiene sentido sin la entidad principal, IOW, cada vez que se elimina una entidad principal, sus hijos también serán ...
dellasavia
1
Creo que NO es la Entidad secundaria, es el Tipo de Valor / Objeto de Valor el que está incrustado y cuya existencia significa menos sin la Entidad principal en la que está contenido.
CuriousMind
de acuerdo con @CuriousMind, en JPA una 'Entidad' tiene su propio ciclo de vida.
mhrsalehi

Respuestas:

124

Creo que @ElementCollectiones principalmente para mapear no entidades (integrables o básicas) mientras @OneToManyse usa para mapear entidades. Entonces, cuál usar depende de lo que quieras lograr.

MrKiane
fuente
1
Gracias Peder por la respuesta! Tiene un punto válido allí ya que @OneToMany solo puede relacionar entidades.
n_g
157

ElementCollectiones una anotación JPA estándar, que ahora se prefiere sobre la anotación patentada de Hibernate CollectionOfElements.

Significa que la colección no es una colección de entidades, sino una colección de tipos simples (Strings, etc.) o una colección de elementos incrustables (clase anotada con @Embeddable).

También significa que los elementos son propiedad exclusiva de las entidades que los contienen: se modifican cuando se modifica la entidad, se eliminan cuando se elimina la entidad, etc. No pueden tener su propio ciclo de vida.

JB Nizet
fuente
... y no puedes consultarlos por su cuenta.
Atrapado el
66

@ElementCollectionle permite simplificar el código cuando desea implementar una relación de uno a muchos con un tipo simple o incrustado. Por ejemplo, en JPA 1.0 cuando deseaba tener una relación uno a muchos con una lista de Strings, tenía que crear una entidad simple POJO ( StringWrapper) que contenía solo la clave primaria y la Stringpregunta:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Con JPA 2.0 puedes simplemente escribir:

@ElementCollection
private Collection<String> strings;

Más simple, ¿no? Tenga en cuenta que aún puede controlar los nombres de tabla y columna mediante @CollectionTableanotaciones.

Ver también:

Tomasz Nurkiewicz
fuente
Gran explicación para el razonamiento. :)
Phuah Yee Keat
4

Básico o integrado : @ElementCollection
Entidades : @OneToMany o @ManyToMany

@ElementCollection:

  • la relación es administrada (solo) por la entidad en la que se define la relación
  • la tabla contiene una referencia de identificación de la entidad propietaria más atributos básicos o integrados

@OneToMany / @ManyToMany:

  • también puede ser administrado por la otra entidad
  • la tabla o columna (s) de unión generalmente solo contiene referencias de identificación
fidudidu
fuente
1

@ElementCollectionmarca una colección Esto no significa necesariamente que esta colección haga referencia a una unión 1-n.

chzbrgla
fuente
1
Entonces, ¿cuál es exactamente el propósito de @ElementCollection?
n_g
0

ElementCollection puede anular las asignaciones o la tabla para su colección, por lo que puede hacer que varias entidades hagan referencia a la misma clase Embeddable, pero que cada una almacene sus objetos dependientes en una tabla separada.

farshad-nsh
fuente