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

95

Есть ли разница, если я использую

@OneToMany
public Set<Rating> ratings;

или если я использую

@OneToMany
public List<Rating> ratings;

оба работают нормально, я знаю разницу между списком и набором, однако я не знаю, имеет ли это значение, как спящий режим (или, скорее, JPA 2.0) обрабатывает его.

M4ks
источник

Ответы:

111

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

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

Часто бывает сложно использовать Sets с Hibernate, когда вам нужно определить equalsи hashCodeдля сущностей, и у них нет неизменяемого функционального ключа в сущности.

JB Nizet
источник
3
Подробную информацию о том, что происходит со списком, см. На stackoverflow.com/q/1995080/2495717 .
ben3000
31

Если вы используете List, вы можете указать предложение Order BY в функции получения. Вы не можете сделать этого с Сетом. Предложение order by может содержать частичный EJBQL; Например

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

Если вы оставите это поле пустым, то список будет отсортирован в возрастающем порядке на основе значения первичного ключа.

Basanth Roy
источник
19
Поскольку он отправил мне скремблирование моих документов Hibernate: вы можете @Sort установить - просто используйте, SortedSetкак описано в документации .
mabi
но если вы используете SortedSet, он сортируется с помощью компаратора, нет способа упорядочить его по базе данных «упорядочить по».
samir105
Поскольку это старый ответ, я хотел бы его прояснить. В настоящее время мы МОЖЕМ использовать @OrderByна Set. Ниже будет использоваться Hibernate, OrderedSetTypeкоторый будет создавать экземпляр LinkedHashSet, поэтому порядок сохраняется. Дополнительно я бы предложил использовать LinkedHashSetв сущности - для единообразия. Источник: discourse.hibernate.org/t/…
Мартин,