24

SetHibernate 中的和Bag集合之间的主要区别是什么?在什么场景下我们应该使用Setand Bag

4

4 回答 4

25

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 一对多 XML 教程

于 2012-12-12T16:06:18.223 回答
7

从休眠参考:

包是最坏的情况,因为它们允许重复的元素值,并且由于它们没有索引列,因此无法定义主键。Hibernate 无法区分重复的行。

并且:

然而,有一种特殊情况,其中包和列表比集合的性能要好得多。例如,对于具有inverse="true"标准双向一对多关系习惯用法的集合,我们可以将元素添加到包或列表中,而无需初始化(获取)包元素。

于 2012-12-11T08:53:08.653 回答
6

各种集合之间的快速摘要差异如下

  • 设置- 没有重复和没有顺序
  • - 可以包含重复项且无顺序(也称为无序列表或带有重复项的集合)

  • 列表- 可以包含重复但保留顺序

    • 可以使用@OrderBy 创建以保持顺序
于 2018-01-17T05:28:37.967 回答
2

两者都是无序集合。袋子允许重复。集没有。

于 2012-12-11T01:39:08.223 回答