@OneToMany List vs Set difference


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

@OneToMany
public Set<Rating> ratings;

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

@OneToMany
public List<Rating> ratings;

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

2 73

2 ответа:

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

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

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

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

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

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