Все эти объекты в NHibernate точно такие же, как и другие реализации этих абстрактных типов данных (ADT). Я был удивлен, насколько сложно найти наборы и сумки в Интернете из-за того, как часто встречаются названия для других вещей, поэтому я перечислил здесь некоторые ссылки и описания.
Для получения более подробной информации смотрите следующее:
Списки ,
Наборы и
Сумка
Общие правила:
Списки по умолчанию упорядочены, используйте их, если вы хотите иметь возможность извлекать объект по его индексу или у вас есть странная любовь for
петель над foreach
петлями. Вы не обязаны получать к ним доступ в порядке, необходимом для Связанного списка . Этот ADT позволяет дублировать.
Обратите внимание! Хотя списки упорядочены так, как BryanD упомянул в своем ответе, абсолютно ничего не говорит о том, что это должно быть в порядке, который вы ожидаете от базы данных, когда вы выполняете HQL-запрос, если вы не укажете порядок по команде. Из-за этого некоторые люди предпочитают вместо этого использовать Set или Bags, чтобы он не создавал иллюзию того, что заказан. Хотя я говорю это, в большинстве случаев они будут отображаться в видимом порядке, поскольку они добавляются в список в том порядке, в котором они найдены в запросе, который запускает NHibernate.
Наборы являются не по умолчанию, вы не можете получить доступ к любой переменной напрямую через индекс. По умолчанию наборы являются только ADT из трех вышеупомянутых, которые поддерживают уникальность своих объектов . Это замечательно, если у вас есть коллекция, если вы не хотите содержать дубликаты.
Сумки (или Multisets ), как вы можете видеть из ссылок выше, тип Set, который позволяет объектам внутри него быть дубликатами других объектов. Обычно они не используются, так как упорядочение списков можно игнорировать и, следовательно, рассматривать как пакет.
Что касается того, как они используются в NHibernate, из базы данных ничего не извлекается по-разному, в зависимости от того, какой ADT вы здесь выбираете, именно то, для чего вы хотите его использовать, должно заставить вас выбрать другой ADT.
Лично я использую наборы для большинства вещей, так как я обычно требую, чтобы дочерние объекты были уникальными, и упорядочение не является проблемой. Хотя я буду использовать списки, в которых у меня есть группа объектов, которые я хочу упорядочить по чему-либо, например, по времени, чтобы достичь этого порядка, мне нужно вручную установить «порядок по» в HQL-запросе.