Hibernate: лучший тип коллекции для использования - сумка, idbag, набор, список, карта - PullRequest
11 голосов
/ 01 октября 2009

Я ищу то, что большинство людей используют в качестве типа своей коллекции при создании однозначных ассоциаций в Hibernate. Устаревшее приложение, которое я поддерживаю, использует исключительно пакеты, но хранит их в виде списков в коде. Связанные таблицы имеют поле id, поэтому idbag кажется более подходящим, но документация рекомендует Set.

РЕДАКТИРОВАТЬ: я ошибочно сослался на то, что документация рекомендует набор. На самом деле официальная документация одинаково расплывчата по всем типам коллекций. Я обнаружил, что некоторые веб-сайты , по-видимому, делают вывод о том, что Set является наиболее распространенным, и книга Hibernate, которую я читаю, прямо говорит об наборах:

Это самая распространенная постоянная коллекция в типичном приложении Hibernate. (см. стр. 242 «Сохранения Java в спящем режиме» Кристиана Бауэра и Гэвина Кинга)

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

EDIT2: обратите внимание, что Гэвин Кинг является создателем Hibernate

Ответы [ 4 ]

12 голосов
/ 20 января 2012

Исходя из опыта использования обоих, я бы порекомендовал использовать список. Если вы извлекаете данные из базы данных и отображаете / манипулируете ими, то их почти всегда необходимо поддерживать в согласованном порядке. Вы можете использовать SortedSet, но это может добавить целый мир боли (переопределение equals, hashcode и т. Д. И сортировка различными способами) по сравнению с простым добавлением ордера путем его сохранения в списке. Списками легче манипулировать - если пользователь удаляет строку 3 на странице, то просто удаляет пункт 3 в списке. Работа с множеством, по-видимому, включает в себя множество ненужного кода и возни с итераторами.

Когда я использовал Наборы с Hibernate, я часто обнаруживал, что через несколько недель вырываю все Наборы и заменяю их на Списки, потому что Наборы дают мне слишком много ограничений.

Документация Hibernate и сторонние инструменты, по-видимому, используют наборы по умолчанию, но из сложного опыта я обнаружил, что использовать списки гораздо эффективнее.

9 голосов
/ 15 апреля 2010

Хорошо, через некоторое время я нашел причину НЕ использовать Set в качестве типа коллекции. Из-за проблем с переопределением хэш-кода / равно и того, как сохраняется спящий режим, использование любой функциональности java API, которая вызывает хэш-код / ​​равно, является плохой идеей. Нет хорошего способа последовательно сравнивать объекты до и после персистенции. Придерживайтесь коллекций, которые не используют равные / хэш-коды, такие как bag.

Подробнее здесь:

http://community.jboss.org/wiki/EqualsandHashCode (эта ссылка звучит так, будто бизнес-ключ - это путь, но прочитайте следующую ссылку полностью, чтобы понять, почему это не всегда хорошая идея)

https://forum.hibernate.org/viewtopic.php?f=1&t=928172 (прочитайте всю дискуссию, чтобы ваша голова кружилась)

5 голосов
/ 01 октября 2009

Я предполагаю, что люди используют разные вещи :-) - разные типы коллекций служат разным целям, поэтому «лучший» зависит от того, для чего он вам нужен.

Тем не менее, использование List в коде обычно более удобно, чем использование Set, хотя указанное List неупорядочено. Если ничто иное, '.get (0)' проще для глаз, чем .iterator().next() :-) Для этой цели определенно подходит поддержка Hibernate, плюс вы даже можете добавить декларацию order-by (если применимо) и иметь свой список отсортированный.

idbag - совершенно другое животное, используемое для ассоциаций «многие ко многим»; Вы не можете реально сравнить его с обычным набором или списком.

2 голосов
/ 02 октября 2009

Я бы порекомендовал использовать набор, потому что набор определяется как набор уникальных предметов и обычно это то, с чем вы имеете дело.

И .iterator().next() сохраняется, когда в вашей коллекции нет элемента.

.get(0) может выдать IndexOutOfBoundsException, если вы открываете пустой список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...