Hibernate集合映射

Hibernate 定义了三种基本类型的集合:

这个分类是区分了不同的表和外键关系类型,但是它没有告诉我们关系模型的所有内容。 要完全理解他们的关系结构和性能特点,我们必须同时考虑“用于 Hibernate 更新或删除集合行数据的主键的结构”。因此得到了如下的分类:

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

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

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

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

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


eg:

1、Set

<set name="setemps" table="emp" cascade="all" fetch="join"> <key> <column name="deptno" precision="2" scale="0" not-null="true" /> </key> <one-to-many class="org.han.one_to_many.Emp" /> </set>

2、Map

<map name="mapeps" table="emp"> <key column="deptno"></key> <map-key column="empno" type="string"></map-key> <one-to-many class="org.han.one_to_many.Emp" /> </map>


3、Bag

<bag name="bagemps"> <key column="deptno"></key> <one-to-many class="org.han.one_to_many.Emp" /> </bag>

对应的集合属性是List


4、List

<list name="listemps" table="emp"> <key column="deptno"></key> <list-index column="empno"base="100"></list-index> <one-to-many class="org.han.one_to_many.Emp" /> </list>


list-index:集合的索引

base:索引的起始位置,不能超过empno记录的最小值

java结果:

mysql> select * from emp where deptno=10;
+-------+--------+-----------+------+------------+---------+--------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+--------+--------+
| 7782 | CLARK | MANAGER | 7839| 1981-06-09 | 2450.00 | 321.00 | 10 |
| 7839 | KING| PRESIDENT | NULL | 1981-11-17 | 5000.00 | 123.00 | 10 |
| 7934 | MILLER | CLERK | 7782| 1982-01-23 | 1300.00 | 123.00 | 10 |
+-------+--------+-----------+------+------------+---------+--------+--------+

集合元素结构:[100...NULL...7781,Emp,7783....NULL....7838,Emp,7840...NULL...7934,Emp]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值