Hibernate中Set和Bag的区别

Sri*_*san 23 hibernate

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

Vir*_*tel 24

A <bag>是无序集合,可以包含重复元素.这意味着如果你持有一个包含一些元素顺序的包,你就不能指望在检索它时保留相同的订单.Java集合框架中没有"包"概念,所以我们只使用一个java.util.List对应的a <bag>.

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>
Run Code Online (Sandbox Code Playgroud)

制图 <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>
Run Code Online (Sandbox Code Playgroud)

因此,两者在hbm文件中的映射方式完全相同.但只是它处理重复记录的方式不同.

来源:Hibernate One to Many XML教程


Hop*_*ing 6

各种集合之间的快速总结差异如下

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

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

    • 可以使用@OrderBy 创建以保留顺序


Atr*_*opo 5

从Hibernate参考:

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

并且:

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