Set
Hibernate 中的和Bag
集合之间的主要区别是什么?在什么场景下我们应该使用Set
and Bag
?
4 回答
A<bag>
是一个无序集合,它可以包含重复的元素。这意味着,如果您持久保存具有某种元素顺序的包,则不能期望在检索集合时保留相同的顺序。Java 集合框架中没有“包”的概念,所以我们只使用 ajava.util.List
对应 a <bag>
。
A与 A<set>
类似,<bag>
只是它只能存储唯一的对象。这意味着集合中不能包含重复的元素。当您第二次将相同的元素添加到集合中时,它将替换旧的元素。默认情况下,集合是无序的,但我们可以要求对其进行排序。Java中a的对应类型是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 无法区分重复的行。
并且:
然而,有一种特殊情况,其中包和列表比集合的性能要好得多。例如,对于具有
inverse="true"
标准双向一对多关系习惯用法的集合,我们可以将元素添加到包或列表中,而无需初始化(获取)包元素。
各种集合之间的快速摘要差异如下
- 设置- 没有重复和没有顺序
包- 可以包含重复项且无顺序(也称为无序列表或带有重复项的集合)
列表- 可以包含重复但保留顺序
- 可以使用@OrderBy 创建以保持顺序
两者都是无序集合。袋子允许重复。集没有。