Вопрос об использовании набора или списка гораздо сложнее, я думаю. По крайней мере, когда вы используете hibernate в качестве реализации JPA. Если вы используете Список в спящем режиме, он автоматически переключается на парадигму «Сумки» , где могут существовать дубликаты.
И это решение оказывает существенное влияние на запросы, которые выполняет Hibernate. Вот небольшой пример:
Существует два объекта: сотрудник и компания , типичное отношение «многие ко многим». для отображения этих объектов друг на друга существует JoinTable (назовем его «employeeCompany»).
Вы выбираете Список типов данных для обеих организаций (Компания / Сотрудник)
Так что если вы решите удалить Сотрудник Джо из CompanyXY , hibernate выполнит следующие запросы:
delete from employeeCompany where employeeId = Joe;
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXA);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXB);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXC);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXD);
insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXE);
А теперь вопрос: почему, черт возьми, Hibernate не только выполняет этот запрос?
delete from employeeCompany where employeeId = Joe AND company = companyXY;
Ответ прост (и большое спасибо Нираву Ассару за его пост в блоге): Он не может . В мире сумок удалите все и вставьте все остальное - единственный правильный путь! Прочитайте это для большего разъяснения. http://assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html
Теперь большой вывод:
Если вы выберете набор вместо списка в своем сотруднике / компании - организациях, у вас не возникнет этой проблемы, и будет выполнен только один запрос!
И почему это? Поскольку hibernate больше не находится в мире сумок (как вы знаете, Sets не допускает дублирования), и теперь возможно выполнение только одного запроса.
Так что решение между List и Sets не так просто, по крайней мере, когда речь идет о запросах и производительности!