В чем основное отличие между коллекциями Set
и Bag
в Hibernate?
В каких сценариях мы должны использовать Set
и Bag
?
Разница между набором и сумкой в спящем режиме
Ответ 1
A <bag>
- неупорядоченный набор, который может содержать дублированные элементы. Это означает, что если вы сохраняете сумку с некоторым порядком элементов, вы не можете ожидать, что тот же порядок сохранится при извлечении коллекции. В структуре коллекций Java нет понятия "сумка", поэтому мы просто используем java.util.List
соответствует <bag>
.
A <set>
похож на <bag>
, за исключением того, что он может хранить только уникальные объекты. Это означает, что никакие повторяющиеся элементы не могут содержаться в наборе. Когда вы добавите один и тот же элемент в набор во второй раз, он заменит старый. По умолчанию неупорядоченный набор, но мы можем попросить его отсортировать. Соответствующий тип a в Java - java.util.Set
.
Примеры
Отображение <set>
<set name="employees" table="employee"
inverse="true" lazy="true" fetch="select">
<key>
<column name="department_id" not-null="true" />
</key>
<one-to-many class="net.viralpatel.hibernate.Employee" />
</set>
Отображение <bag>
<bag name="employees" table="employee"
inverse="true" lazy="true" fetch="select">
<key>
<column name="employee_id" not-null="true" />
</key>
<one-to-many class="net.viralpatel.hibernate.Employee" />
</bag>
Таким образом, оба отображаются точно так же в hbm файле. Но отличается только тем, как он обрабатывает повторяющиеся записи.
Источник: Hibernate One to Many XML Tutorial
Ответ 2
Из справки Hibernate:
Сумки являются наихудшим случаем, поскольку они позволяют дублировать значения элементов и, поскольку у них нет индекса столбца, первичный ключ не может быть определен. Hibernate не имеет возможности различать повторяющиеся строки.
А также:
Однако существует конкретный случай, когда сумки, а также списки намного более эффективны, чем наборы. Для коллекции с
inverse="true"
, стандартной двунаправленной идиомой отношения "один ко многим", например, мы можем добавлять элементы в сумку или список без необходимости инициализации (выборки) элементов пакета.
Ответ 3
Оба являются неупорядоченными коллекциями. Сумки позволяют дублировать. Наборы не делают.
Ответ 4
Кратковременное различие между различными коллекциями ниже
- Установить - нет дубликатов и нет порядка
-
Сумка. Может содержать дубликаты и порядок (также называемый, неупорядоченный список или набор с дубликатами).
-
Список. Может содержать дубликаты, но с сохраненным порядком.
- Может быть создан с помощью @OrderBy для сохранения порядка