Hibernate 映射实体类中的3种集合类型

一、Map:一组键值对应的无序,唯一的数据。

二、Set:一组无序,唯一的数据    该集合是用的最多的。

三、List:一组有序、不唯一的数据。

<!-- List 集合的节点 -->
<bag name="emps">
	<key column="deptno"/>
	<one-to-many class="org.entity.Emp"/>
</bag>

<!-- 还是 List 集合的节点,但该 List 的 key 从 base 或者0开始直到该集合的 list-index 的列最大值-->
<list name="emps">
	<key column="deptno" />
	<list-index column="empno" />
	<one-to-many class="org.entity.Emp"/>
</list>

<!-- Map 集合的节点 -->
<map name="emps" inverse="true" cascade="all">
	<key column="deptno" />
	<map-key type="java.lang.Integer" column="empno"></map-key>
    <one-to-many class="org.entity.Emp" />
</map>

<!-- Set 集合的节点 -->
<set name="emps" inverse="true" cascade="all">
    <key>
        <column name="DEPTNO" precision="2" scale="0" />
    </key>
    <one-to-many class="org.entity.Emp" />
</set>

所有的有序集合类(maps,lists,arrays)都拥有一个由 <key> 和 <index> 组成的主键。这种情况下集合类的更新是非常高效的 — 主键已经被有效的索引,因此当 Hibernate 试图更新或删除一行时,可以迅速找到该行数据。

 

集合(sets)的主键由 <key> 和其他元素字段构成。对于有些元素类型来说,这很低效,特别是组合元素或者大文本、大二进制字段;数据库可能无法有效的对复杂的主键进行索引。另一方面,对于一对多、多对多关联,特别是合成的标识符来说,集合也可以达到同样的高效性能。( 附注:如果你希望 SchemaExport 为你的 <set> 创建主键,你必须把所有的字段都声明为 not-null="true"。)

 

<idbag> 映射定义了代理键,因此它总是可以很高效的被更新。事实上,<idbag> 拥有着最好的性能表现。

 

Bag 是最差的。因为 bag 允许重复的元素值,也没有索引字段,因此不可能定义主键。 Hibernate 无法判断出重复的行。当这种集合被更改时,Hibernate 将会先完整地移除 (通过一个(in a single DELETE))整个集合,然后再重新创建整个集合。因此 Bag 是非常低效的。

 

请注意:对于一对多关联来说,“主键”很可能并不是数据库表的物理主键。但就算在此情况下,上面的分类仍然是有用的。(它仍然反映了 Hibernate 在集合的各数据行中是如何进行“定位”的。)

猜你喜欢

转载自ears.iteye.com/blog/1508557