@OneToMany List <> vs Set <> Unterschied

94

Gibt es einen Unterschied, wenn ich benutze

@OneToMany
public Set<Rating> ratings;

oder wenn ich benutze

@OneToMany
public List<Rating> ratings;

beide funktionieren in Ordnung, ich kenne den Unterschied zwischen einer Liste und einem Satz, aber ich weiß nicht, ob dies einen Unterschied macht, wie der Ruhezustand (oder besser JPA 2.0) damit umgeht.

M4ks
quelle

Antworten:

109

Wenn keine Indexspalte angegeben ist, wird eine Liste von Hibernate nur als Tasche behandelt (keine bestimmte Reihenfolge).

Ein bemerkenswerter Unterschied bei der Behandlung von Hibernate besteht darin, dass Sie nicht zwei verschiedene Listen in einer einzigen Abfrage abrufen können. Wenn Sie beispielsweise eine PersonEntität mit einer Kontaktliste und einer Adressliste haben, können Sie keine einzige Abfrage verwenden, um Personen mit all ihren Kontakten und Adressen zu laden. In diesem Fall besteht die Lösung darin, zwei Abfragen durchzuführen (wodurch das kartesische Produkt vermieden wird) oder für mindestens eine der Sammlungen eine Setanstelle einer Listzu verwenden.

Es ist oft schwierig, Sets mit Ruhezustand zu verwenden, wenn Sie Entitäten definieren equalsund hashCodebearbeiten müssen und keinen unveränderlichen Funktionsschlüssel in der Entität haben.

JB Nizet
quelle
3
Ausführliche Informationen zu den Vorgängen mit einer Liste finden Sie unter stackoverflow.com/q/1995080/2495717 .
Ben3000
31

Wenn Sie eine Liste verwenden, können Sie in der Getter-Funktion eine 'Order BY'-Klausel angeben. Mit einem Set geht das nicht. Die order by-Klausel kann partielles EJBQL enthalten. Beispielsweise

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Wenn Sie dieses Feld leer lassen, wird die Liste in aufsteigender Reihenfolge nach dem Wert des Primärschlüssels sortiert.

Basanth Roy
quelle
19
Da ich nach meinen Hibernate-Dokumenten gesucht habe: Sie können @Sort ein Set erstellen - verwenden Sie es einfach SortedSetwie in den Dokumenten beschrieben .
Mabi
Wenn Sie jedoch SortedSet verwenden, wird es mit dem Komparator sortiert. Es gibt keine Möglichkeit, es nach der Reihenfolge der Datenbank zu sortieren.
Samir105
Da es sich um eine alte Antwort handelt, möchte ich sie klarstellen. Derzeit können wir @OrderByauf verwenden Set. Darunter wird Hibernate verwendet, OrderedSetTypewodurch a instanziiert wird LinkedHashSet, sodass die Reihenfolge erhalten bleibt. Zusätzlich würde ich vorschlagen, LinkedHashSetin Entität zu verwenden - aus Gründen der Konsistenz. Quelle: diskurs.hibernate.org/t/…
Martin