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.

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.