Was ist der Unterschied zwischen der Verwendung einer @OneToMany
- und @ElementCollection
-Anmerkung, da beide in der Eins-zu-Viele-Beziehung arbeiten?
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.
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.
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 String
s 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.
Basic oder Embedded : @ElementCollection
Entitäten : @OneToMany oder @ManyToMany
@ElementCollection:
@ OneToMany/@ManyToMany:
@ElementCollection
kennzeichnet eine Sammlung. Dies bedeutet nicht notwendigerweise, dass diese Auflistung auf eine 1-n-Verknüpfung verweist.
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.