Hibernate学习笔记(2)之集合配置

来源:互联网 发布:android 解析json 编辑:程序博客网 时间:2024/06/01 09:40

集合属性的映射

1.        一个集合对应一个集合表。

2.        使用集合属性时,一定要使用接口,而不能声明为具体的实现类。因为经过Session操作后,集合就变成了Hibernate自己的集合实现类

值类型的集合

一、Set集合

1.        Set集合:addressSet属性 在映射表中的配置,set集合中存储的对象应对应一张表,需要在映射表中完成,存储对象对应表的内容:主键、信息。

1)        table属性:集合表的名称

2)        key子元素:集合外键的列名,即外表的外键。这个外键与本表的主键相关联。

3)        element子元素:存放集合元素的列的信息

4)        sort属性:"unsorted| natural | comparatorClass" 默认为:unsorted,这个属性可为TreeSet和TreeMap排序。

如果使用了sort的属性,则定义容器时使用sortSet<E>

5)        order-by属性:写的是orderby 子句,是SQL语句,是操作的集合表。这是在查询数据时指定orderby子句。


二、list集合

1.        由于list集合时有序的,所以在集合表中需添加一列,用来作为联合主键,使查询结果有序。

2.        llst-index:用来存放索引的列


三、Map集合

1.        与list集合相似,较Set集合表多出一列,用来表示key。


四、其他集合

1.        数组:


2.        Bag:无序、可重复。Java中使用list装数据


实体类型的集合


一对多映射:1:n

1.        1的一方

1)        Demain中:

使用一个set集合,存储类型是“多”一方数据的实体。

2)        在映射配置文件中


a)        name:set集合的属性名

b)        key:映射“多”方表中的外键类名

c)        one-to-many:中class指明“多方”的实体类。即关联的实体类。

3)        其他属性:

a)        inverse属性:

默认为false,表示本方维护关联关系。

如果为true,表示本方不维护关联关系。

只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响。

b)        cascade属性

默认为none,代表不级联。

级联是指操作主对象时,对关联的对象也做相同的操作。

可设为:delete, save-update, all, none ...

2.        多的一方

1)        Demain中:

设置一个“1”方的类对象,用来指定属于哪一个类别。

2)        在映射配置文件中

<many-to-one name="department" class="Department" column="deparmentId"/>

a)        name:指明属性名称。

b)        class:关联的实体类

c)        column:外加列名称

多对多:n:m


1.        在Demain中:

每一“多”方的Demain中都有一个set集合。这个集合用来保存关联对象的集合。

2.        在映射配置文件中

如图需要说明以上4个消息。以其中一个为例:


1)        Name:指明类中集合属性名称

2)        Table:中间表名称

3)        Key:关联集合的外键,列名称。

4)        Class:关联对象

5)        Column:关联对象在关联集表(中间表)中的外键名称,列名称。

一对一映射


1.        基于外键形式(最常用)

1)        无外键方:<one-to-one name=".."class=".." property-ref="obj"/>


Name:属性名称。

Class:关联对象的类型。(这两项在关联实体中必有)

Property-ref:有外键方,外键列的名称。

2)        有外键方:<many-to-one name="obj"class=".." column=".." unique="true"/>


Name:属性名称。

Class:关联对象类型。

Unique:唯一性约束。在有外键方,外键需要加上唯一性约束。这样才能保证一对一的映射。

2.        基于主键的(几乎不用)

继承结构

1.        整个继承结构使用一张表


1)        子类使用<subclass>标签。

2)        子类中不用指定表的名称,因为子类不创建表。

3)        使用一张表表示整个继承关系时,需要添加一个鉴别列。即

<discrimnator type=”string” column=”class_”>

4)        并且在每个子类中需指定鉴别类的值。

<subclass name=… discriminator-value=”…”>

2.        每个类创建一张表


1)        子类使用<joined-subclass>标签

2)        子类中需要指定表名称。

3)        子类中需要定义指向父类Id的外键

3.        每个具体的类对应一张表,即父类不对应表

1)        父类中需指定 abstract=”fale”,即不会为它创建表

2)        父类中主键生成策略不能使用identity,因为整个集成结构中,主键值是不能重复的。


1 0