Hibernate中Set
和Bag
集合之间的主要区别是什么?
在什么情况下我们应该使用Set
和Bag
?
答案 0 :(得分:24)
<bag>
是无序集合,可以包含重复元素。这意味着如果你持有一个包含一些元素顺序的包,你就不能指望在检索它时保留相同的订单。 Java集合框架中没有“包”概念,因此我们只使用与java.util.List
对应的<bag>
。
<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文件中的映射方式完全相同。但只是它处理重复记录的方式不同。
答案 1 :(得分:5)
来自Hibernate参考:
包是最糟糕的情况,因为它们允许重复的元素值,因为它们没有索引 列,无法定义主键。 Hibernate无法区分重复的行。
还有:
然而,有一个特殊情况,其中包和名单的性能要高得多 集。对于具有
inverse="true"
的集合,标准的双向一对多关系习惯用法,例如,我们可以将元素添加到包或列表中,而无需初始化(获取)包元素。
答案 2 :(得分:4)
各种收藏品之间的快速汇总差异如下
行包 - 可以包含重复项和无订单(也称为无序列表或重复项设置)
列表 - 可以包含重复但保留订单
答案 3 :(得分:2)
两者都是无序集合。手袋允许重复。集合没有。