@OneToMany List <> vs Set <> різниця


94

Чи є якась різниця, якщо я використовую

@OneToMany
public Set<Rating> ratings;

або якщо я використовую

@OneToMany
public List<Rating> ratings;

обидва працюють нормально, я знаю різницю між списком та набором, однак я не знаю, чи має це якесь значення, як сплячий режим (вірніше, JPA 2.0) обробляє це.

Відповіді:


109

Список, якщо не вказано стовпець індексу, буде просто оброблятися Hibernate як пакет (без конкретного замовлення).

Помітною відмінністю в роботі з Hibernate є те, що ви не можете отримати два різних списки за один запит. Наприклад, якщо у вас є Personорганізація, що має список контактів та список адрес, ви не зможете використовувати один запит для завантаження людей з усіма їх контактами та всіма їхніми адресами. Рішення в цьому випадку полягає в тому, щоб зробити два запити (що дозволяє уникнути декартового продукту) або використовувати Setзамість a Listпринаймні для однієї з колекцій.

Це часто буває важко використовувати набори з Hibernate , коли ви повинні визначити equalsі hashCodeна юридичних осіб і не має незмінну функціональну клавішу по суті.


3
А подробиці того, що відбувається зі списком, див. Na stackoverflow.com/q/1995080/2495717 .
ben3000

31

Якщо ви використовуєте List, тоді ви можете вказати речення 'Order BY' у функції getter. Ви не можете цього зробити за допомогою набору. Порядок за пунктом може містити частковий EJBQL; Наприклад

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

Якщо залишити це поле порожнім, тоді список буде відсортовано за зростанням на основі значення первинного ключа.


19
Оскільки мені надіслали скремблінг для моїх документів Hibernate: ви можете @Sort встановити набір - просто використовуйте, SortedSetяк пояснено в документах .
mabi

але якщо ви використовуєте SortedSet, він сортується за допомогою компаратора, немає можливості зробити його упорядкованим за базою даних "упорядкувати за".
samir105

Оскільки це стара відповідь, я хотів би це пояснити. В даний час ми МОЖЕМ використовувати @OrderByна Set. Знизу використовується Hibernate, OrderedSetTypeякий створить інстанцію a LinkedHashSet, тому порядок буде збереженим. Додатково я б запропонував використовувати LinkedHashSetв сутності - заради послідовності. Джерело: discourse.hibernate.org/t/…
Мартін,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.