wake-up-neo.com

Unterschied zwischen @OneToMany und @ElementCollection?

Was ist der Unterschied zwischen der Verwendung einer @OneToMany- und @ElementCollection-Anmerkung, da beide in der Eins-zu-Viele-Beziehung arbeiten?

98
n_g

Ich glaube, @ElementCollection ist hauptsächlich für das Abbilden von Nicht-Entitäten (eingebettet oder einfach) gedacht, während @OneToMany zum Abbilden von Entitäten verwendet wird. Welches davon verwendet wird, hängt davon ab, was Sie erreichen möchten. 

82
MrKiane

ElementCollection ist eine Standard-JPA-Annotation, die jetzt der proprietären Hibernate-Annotation CollectionOfElements vorgezogen wird. 

Dies bedeutet, dass es sich bei der Auflistung nicht um eine Sammlung von Entitäten handelt, sondern um eine Sammlung einfacher Typen (Strings usw.) oder um eine Sammlung einbettbarer Elemente (mit @Embeddable annotierte Klasse).

Dies bedeutet auch, dass sich die Elemente vollständig im Besitz der enthaltenen Entitäten befinden: Sie werden geändert, wenn die Entität geändert, gelöscht, wenn die Entität gelöscht wird usw. Sie können keinen eigenen Lebenszyklus haben.

133
JB Nizet

Mit @ElementCollection können Sie den Code vereinfachen, wenn Sie die One-to-Many-Beziehung mit einem einfachen oder eingebetteten Typ implementieren möchten. In JPA 1.0 mussten Sie zum Beispiel, wenn Sie eine Eins-zu-Viele-Beziehung zu einer Liste von Strings haben wollten, eine einfache Entität POJO (StringWrapper) erstellen, die nur Primärschlüssel und die betreffende String enthält:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Mit JPA 2.0 können Sie einfach schreiben:

@ElementCollection
private Collection<String> strings;

Einfacher, nicht wahr? Beachten Sie, dass Sie die Tabellen- und Spaltennamen weiterhin mit der @CollectionTable-Annotation steuern können.

Siehe auch:

47

Basic oder Embedded : @ElementCollection
Entitäten : @OneToMany oder @ManyToMany

@ElementCollection:

  • die Beziehung wird (nur) von der Entität verwaltet, in der die Beziehung definiert ist
  • tabelle enthält eine ID-Referenz auf die besitzende Entität sowie grundlegende oder eingebettete Attribute

@ OneToMany/@ManyToMany:

  • kann auch von der anderen Entität verwaltet werden
  • join-Tabelle oder -Spalte (n) enthält normalerweise nur ID-Referenzen
2
fidudidu

@ElementCollection kennzeichnet eine Sammlung. Dies bedeutet nicht notwendigerweise, dass diese Auflistung auf eine 1-n-Verknüpfung verweist.

1
chzbrgla

ElementCollection kann die Zuordnungen oder die Tabelle für ihre Auflistung überschreiben. Sie können also mehrere Entitäten auf dieselbe Embeddable-Klasse verweisen, aber ihre abhängigen Objekte in einer separaten Tabelle speichern.

0
farshad-nsh