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.