Hibernate中Set和Bag的区别

时间:2012-12-11 01:35:06

标签: hibernate

Hibernate中SetBag集合之间的主要区别是什么? 在什么情况下我们应该使用SetBag

4 个答案:

答案 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文件中的映射方式完全相同。但只是它处理重复记录的方式不同。

来源:Hibernate One to Many XML Tutorial

答案 1 :(得分:5)

来自Hibernate参考:

  

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

还有:

  

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

答案 2 :(得分:4)

各种收藏品之间的快速汇总差异如下

  • 设置 - 无重复且无订单
  • 行包 - 可以包含重复项和无订单(也称为无序列表或重复项设置)

  • 列表 - 可以包含重复但保留订单

    • 可以使用@OrderBy创建以保留订单

答案 3 :(得分:2)

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