web-dev-qa-db-fra.com

Différence entre @OneToMany et @ElementCollection?

Quelle est la différence entre utiliser une annotation @OneToMany et @ElementCollection puisque les deux fonctionnent sur la relation un à plusieurs?

98
n_g

Je crois que @ElementCollection est principalement destiné à mapper des non-entités (intégrables ou basiques) tandis que @OneToMany est utilisé pour mapper des entités. Laquelle à utiliser dépend donc de ce que vous voulez réaliser. 

82
MrKiane

ElementCollection est 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 incorporables (classe annotée avec @Embeddable).

Cela signifie également que les éléments sont entièrement détenus par les 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.

133
JB Nizet

@ElementCollection vous 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 souhaitiez établir une relation un-à-plusieurs avec une liste de Strings, vous deviez créer une entité simple POJO (StringWrapper) contenant uniquement la clé primaire et le String en 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, n'est-ce pas? Notez que vous pouvez toujours contrôler les noms de table et de colonne à l'aide de l'annotation @CollectionTable.

Voir également:

47
Tomasz Nurkiewicz

Basic ou Embedded : @ElementCollection
Entities : @OneToMany ou @ManyToMany

@ElementCollection:

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

@OneToMany/@ManyToMany:

  • peut également être géré par l'autre entité
  • la table ou les colonnes de jointure ne contient généralement que des références d'identifiant
2
fidudidu

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

1
chzbrgla

ElementCollection peut remplacer les mappages, ou la table pour leur collection, de sorte que plusieurs entités puissent référencer la même classe Embeddable, tout en stockant leurs objets dépendants dans une table distincte.

0
farshad-nsh