posts - 0,  comments - 0,  trackbacks - 0

Hibernate的主键映射


关系数据库中依靠主键来区分不同的记录,主键又有自然与代理主键之分。

所谓自然主键就是充当主键的字段本身具有一定的含义,是构成记录的组成部分。比如说学生的学号,除了充当主键之外,同时也是学生记录的主要组成部分。
所谓代理主键就是充当主键的字段本身不具有业务含义,只起主键的作用,比如自动增长类型的ID号等。

在Hibernate应用中,Hibernate依靠对象标识符(OID)来区分不同的持久化对象。而OID则可以通过Hibernate内置的标识生成器来产生。

Hibernate常用的标识生成器

Assigned OID由业务逻辑程序负责产生,Hibernate只是负责持久化,常用于映射自然主键
Hilo OID由Hibernate按照high/low算法产生,该算法需要从 数据库的某个表的字段中读取high值;
Increment OID由Hibernate依递增方式产生,该算法依赖保存于当 前应用实例中的一个最大值变量,当有多个应用实例需要 访问数据库时难免出现重复的主键,应当谨慎使用;
Identity OID由底层数据库的自增主键生成机制产生,如MySQL 的auto_increment类型主键与SQL Server的identity类型 主键
Sequence OID由底层数据库的sequence主键生成机制产生,如 Oracle sequence;
Native 根据底层数据库对自动生成OID能力的支持情况,具体选择identity、sequence、hilo 生成器产生OID,常用与跨平台;

Hibernate的实体映射

Hibernate实体映射的主要任务就是实现数据库关系表与持久化类之间的映射,

持久化类--》ORM映射文件--》数据库表

映射一对一关联关系

Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式.
所谓共享主键方式就是限制两个数据表的主键使用相同的值,通过主键形成一对一的映射关系.
所谓唯一主键就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系.这种一对一的关系其实就是多对一关联关系的一种特殊情况而已.

映射多对一单向关联关系

实体之间的多对一单向关联关系是一中常见的关联关系,比如说Client和Orders,在购物的时候,Client可以有多个Oriders,但是每个Oriders必须有唯一一个Client.
在Orders.hbm.xml中,用<many-to-one />来描述被关联的类.

1<many-to-one name="customer" column="CUSTOMER_ID" class="com.ORM.Customer"/> 

 

在Orders.java中,添加Customer的get和set方法.

映射一对多双向关联关系

在应用中(如上的例子),会有这样的需求:根据给定的Client,要得到Client的ALL Orders;根据给定的Order,得到该Order所属的Client.一对多单向和一对多双向在数据库中的表现方式一样,均通过外键来实现.
在多对一单向关联关系的基础上,在Customer.hbm.xml中,用<set>来描述被关联的类.

1<set name="orders"  
2             cascade="all"  
3             inverse="true"  
4             lazy="false"  
5             >   
6<one-to-many class="com.ORM.Customer">   
7</set> 


映射多对多单向关联关系

多对多的关系非常的普遍,如,Orders和Items,Items和Cart之间的关系均属于多对多的关系.多对多的关系在数据库中不能直接实现,还必须依赖一张连接表来保存这种关联关系.

映射多对多双向关联关系

多对多的双向关联关系就是实现两个互逆的多对多单向关联关系.

映射组成关系

在Hibernate应用开发中,为了提高代码的可重用性,往往需要将一个较大的持久化类分解成两个较小的持久化类,且其中的一个持久化类是另一个持久化类的组成部分.
例如:一个Clients类,为了提高代码的可重用性,将省份,城市,街道住处及邮编单独设计成一个持久化类Address,Address的实例充当Clients的属性.这就是典型的组成关系.

映射Clients与Address之间的组成关系

1<component name="address"  
2                   Class="com.ORM.Address">   
3    <parent name="client" />   
4    <property name="province" column="PROVINCE" type="string" />   
5    <property name="city" column="CITY" type="string" />   
6    <property name="street" column="STREET" type="string" />   
7    <property name="zipcode" column="ZIPCODE" type="string" />   
8    </component> 


映射继承关系
 
在面向对象的程序设计方法中,继承关系是一种非常普遍的关系,然而在关系型数据库中表与表之间不能直接实现这种继承关系.为了将持久化类之间的继承关系映射到数据库中,可以采用为每个具体持久化类(子类)对应一个关系表的映射方法.

Hibernate的集合映射

为了解决不同的需求,JAVA提供了3种类型的集合类,当集合中的对象不需要排序且不存在重复对象时,可选Set类;当集合中可以存在重复对象且需要按索引位置存取时就选用List类;当集合中需要使用键值存取对象时则选用Map类.

posted on 2008-08-06 21:15 邪恶K线图 阅读(294) 评论(0)  编辑  收藏 所属分类: Hibernate