Różnica @OneToMany List <> vs Set <>

96

Czy jest jakaś różnica, jeśli używam

@OneToMany
public Set<Rating> ratings;

lub jeśli używam

@OneToMany
public List<Rating> ratings;

oba działają OK, znam różnicę między listą a zestawem, jednak nie wiem, czy ma to jakikolwiek wpływ na sposób, w jaki hibernacja (a raczej JPA 2.0) ją obsługuje.

M4ks
źródło

Odpowiedzi:

112

Lista, jeśli nie została określona żadna kolumna indeksu, zostanie potraktowana jako zbiór przez Hibernate (brak określonej kolejności).

Jedną znaczącą różnicą w obsłudze Hibernate jest to, że nie można pobrać dwóch różnych list w jednym zapytaniu. Na przykład, jeśli masz Personpodmiot mający listę kontaktów i listę adresów, nie będziesz w stanie użyć jednego zapytania do załadowania osób ze wszystkimi kontaktami i wszystkimi adresami. Rozwiązaniem w tym przypadku jest wykonanie dwóch zapytań (co pozwala uniknąć iloczynu kartezjańskiego) lub użycie Setzamiast a Listdla przynajmniej jednej z kolekcji.

Często trudno jest używać zestawów z hibernacją, gdy musisz zdefiniować equalsi hashCodena encjach i nie masz niezmiennego klucza funkcjonalnego w encji.

JB Nizet
źródło
3
Szczegółowe informacje o tym, co dzieje się z listą, można znaleźć na stronie stackoverflow.com/q/1995080/2495717 .
ben3000
31

Jeśli używasz listy, możesz określić klauzulę „Order BY” w funkcji pobierającej. Nie możesz tego zrobić z zestawem. Klauzula order by może zawierać częściowy kod EJBQL; Na przykład

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

Jeśli pozostawisz to pole puste, lista zostanie posortowana w kolejności rosnącej na podstawie wartości klucza podstawowego.

Basanth Roy
źródło
19
Ponieważ wysłał mnie kodowania dla moich docs Hibernacja: Państwo może @Sort zestaw - wystarczy użyć SortedSetjak wyjaśniono w docs .
mabi
ale jeśli używasz SortedSet, sortuje się za pomocą komparatora, nie ma możliwości uporządkowania go według „kolejności” bazy danych.
samir105
Ponieważ jest to stara odpowiedź, chciałbym ją wyjaśnić. Obecnie możemy używać @OrderByna Set. Pod spodem, Hibernate użyje, OrderedSetTypeco spowoduje utworzenie wystąpienia LinkedHashSet, więc kolejność jest zachowana. Dodatkowo sugerowałbym użycie LinkedHashSetw encji - dla zachowania spójności. Źródło: discourse.hibernate.org/t/…
Martin