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?


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.


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.


... 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:


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

1

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.