Différence entre @OneToMany et @ElementCollection?

130

Quelle est la différence entre l'utilisation de a @OneToManyet d' @ElementCollectionannotation puisque les deux fonctionnent sur la relation un-à-plusieurs?

n_g
la source
3
En un mot, @ElementCollection est utilisé lorsque l'existence de l'entité enfant n'a pas de sens sans l'entité parente, IOW, chaque fois qu'une entité parente est supprimée, vos enfants seront également ...
dellasavia
1
Je crois que ce n'est PAS l'entité enfant, c'est le type de valeur / objet de valeur qui est intégré et dont l'existence a moins de sens sans l'entité principale dans laquelle il est contenu.
CuriousMind
d'accord avec @CuriousMind, dans JPA, une «entité» a son propre cycle de vie.
mhrsalehi le

Réponses:

125

Je crois que @ElementCollectionc'est principalement pour mapper des non-entités (intégrables ou basiques) alors qu'il @OneToManyest utilisé pour mapper des entités. Alors, lequel utiliser dépend de ce que vous voulez réaliser.

MrKiane
la source
1
Merci Peder pour la réponse! Vous avez là un point valide puisque @OneToMany ne peut relier que des entités.
n_g
157

ElementCollectionest une annotation JPA standard, qui est désormais préférée à l'annotation propriétaire Hibernate CollectionOfElements.

Cela signifie que la collection n'est pas une collection d'entités, mais une collection de types simples (Strings, etc.) ou une collection d'éléments intégrables (classe annotée avec @Embeddable).

Cela signifie également que les éléments appartiennent entièrement aux entités qui les contiennent: ils sont modifiés lorsque l'entité est modifiée, supprimés lorsque l'entité est supprimée, etc. Ils ne peuvent pas avoir leur propre cycle de vie.

JB Nizet
la source
... et vous ne pouvez pas les interroger seuls.
Coincé le
67

@ElementCollectionvous permet de simplifier le code lorsque vous souhaitez implémenter une relation un-à-plusieurs avec un type simple ou incorporé. Par exemple, dans JPA 1.0, lorsque vous vouliez avoir une relation un-à-plusieurs avec une liste de Strings, vous deviez créer une simple entité POJO ( StringWrapper) contenant uniquement la clé primaire et l'élément Stringen question:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Avec JPA 2.0, vous pouvez simplement écrire:

@ElementCollection
private Collection<String> strings;

Plus simple, non? Notez que vous pouvez toujours contrôler les noms de table et de colonne à l'aide d' @CollectionTableannotations.

Voir également:

Tomasz Nurkiewicz
la source
Excellente explication du raisonnement. :)
Phuah Yee Keat
4

Basique ou intégrée :
Entités @ElementCollection: @OneToMany ou @ManyToMany

@ElementCollection:

  • la relation est gérée (uniquement) par l'entité dans laquelle la relation est définie
  • la table contient une référence d'identifiant à l'entité propriétaire ainsi que des attributs de base ou incorporés

@OneToMany / @ManyToMany:

  • peut également être géré par l'autre entité
  • la table ou les colonnes de jointure contiennent généralement des références d'identifiant uniquement
fidudidu
la source
1

@ElementCollectionmarque une collection. Cela ne signifie pas nécessairement que cette collection fait référence à une jointure 1-n.

chzbrgla
la source
1
Alors, quel est exactement le but de @ElementCollection?
n_g
0

ElementCollection peut remplacer les mappages ou la table pour leur collection, de sorte que plusieurs entités peuvent référencer la même classe Embeddable, mais que chacune stocke ses objets dépendants dans une table distincte.

farshad-nsh
la source