Unterschied zwischen @OneToMany und @ElementCollection?

128

Was ist der Unterschied zwischen der Verwendung von a @OneToManyund @ElementCollectionAnnotation, da beide an der Eins-zu-Viele-Beziehung arbeiten?

n_g
quelle
3
Kurz gesagt, @ElementCollection wird verwendet, wenn die Existenz der untergeordneten Entität ohne die übergeordnete Entität IOW bedeutungslos ist. Wenn eine übergeordnete Entität entfernt wird, sind Ihre Kinder auch ...
dellasavia
1
Ich glaube, es ist NICHT die untergeordnete Entität, sondern der Werttyp / das Wertobjekt, der eingebettet ist und dessen Existenz ohne die Hauptentität, in der sie enthalten ist, weniger bedeutet.
CuriousMind
stimme @CuriousMind zu, in JPA hat eine 'Entität' einen eigenen Lebenszyklus.
Mhrsalehi

Antworten:

124

Ich glaube, es @ElementCollectionist hauptsächlich für die Zuordnung von Nicht-Entitäten (einbettbar oder einfach) gedacht, während @OneToManyes für die Zuordnung von Entitäten verwendet wird. Welche Sie verwenden, hängt davon ab, was Sie erreichen möchten.

MrKiane
quelle
1
Danke Peder für die Antwort! Sie haben dort einen gültigen Punkt, da @OneToMany nur Entitäten in Beziehung setzen kann.
n_g
157

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

Dies bedeutet, dass die Sammlung keine Sammlung von Entitäten ist, sondern eine Sammlung einfacher Typen (Strings usw.) oder eine Sammlung einbettbarer Elemente (mit Anmerkungen versehene Klasse @Embeddable).

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

JB Nizet
quelle
... und Sie können sie nicht alleine abfragen.
Stuck
65

@ElementCollectionMit dieser Option können Sie Code vereinfachen, wenn Sie eine Eins-zu-Viele-Beziehung mit einem einfachen oder eingebetteten Typ implementieren möchten. Wenn Sie beispielsweise in JPA 1.0 eine Eins-zu-Viele-Beziehung zu einer Liste von Strings haben möchten, müssen Sie eine einfache Entität POJO ( StringWrapper) erstellen, die nur den Primärschlüssel und die Stringfraglichen Elemente 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 steuern können@CollectionTable Anmerkungen .

Siehe auch:

Tomasz Nurkiewicz
quelle
Gute Erklärung für die Argumentation. :)
Phuah Yee Keat
4

Grundlegend oder eingebettet : @ElementCollection-
Entitäten : @OneToMany oder @ManyToMany

@ElementCollection:

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

@OneToMany / @ManyToMany:

  • kann auch von der anderen Entität verwaltet werden
  • Join-Tabellen oder -Spalten enthalten normalerweise nur ID-Referenzen
fidudidu
quelle
1

@ElementCollectionmarkiert eine Sammlung. Dies bedeutet nicht unbedingt, dass diese Sammlung auf einen 1-n-Join verweist.

chzbrgla
quelle
1
Was genau ist der Zweck von @ElementCollection?
n_g
0

ElementCollection kann die Zuordnungen oder Tabellen für ihre Auflistung überschreiben, sodass mehrere Entitäten auf dieselbe Embeddable-Klasse verweisen können, die abhängigen Objekte jedoch jeweils in einer separaten Tabelle gespeichert werden.

farshad-nsh
quelle