Hibernate的基本映射

本文介绍了Hibernate映射文件的结构及元素,包括class、id、property等元素的用途,主键生成器的不同类型,以及如何映射集合和引用属性等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射文件的结构

映射文件的根元素为hibernate-mapping元素,这个元素下可以拥有多个class元素,每个class子元素对应一个持久化类的映射。

格式:

<hibernate-mapping>

       <class/>

       <class/>

       ……

</hibernate-mapping>

 

class元素里:

Name属性:指定该持久化类映射的类名,应为全限定的类名。

(如果不使用全限定的类名,必须在hibernate-mapping元素里指定package属性,用来指定持久化类所在的包名)

(如果需要采用继承映射,则class元素下还会增加subclass元素,joined-classunion元素,这些元素分别用于定义子类)

id元素:用来标识属性用来标识该持久化的实例,因此标识属性通常被映射成数据表的主键。

id元素的name属性的值就是持久化类标识属性名)

 

主键生成器

主键生成器是负责生成数据表记录的主键,有如下几种常见主键生成器:

Increment:long,short,int的数据列生成自动增长主键。(性能低下,一般不用)

Identity:对如SQL Servlet,MySQL等支持自动增长列的数据库,如果数据列的类型是long,short,int,可使用主键生成器生成自动增长主键。

Sequence:对如Oracle,DB2等支持Sequence的数据库,如果数据列的类型是long,short,int,可使用主键生成器生成自动增长主键。

Uuid:对字符串列的数据采用128uuid算法生成唯一的字符串主键。

Property元素:定义持久化类的普通属性,如不在里面不指定cloumn属性,那么默认列名和属性名相同。

 

映射集合属性

集合属性大致有两种:第一种是单纯的集合属性,如List,Set或数组等集合属性;

另一种是Map结构的集合属性,每个属性值都有对应的key映射。

集合映射的元素大致有如下几种:

list:用于映射List集合。

set:用于映射Set集合。

map:用于映射Map集合。

array:用于映射数组集合。

bag:用于映射无序集合。

isbag:用于映射无序集合,但为集合增加逻辑次序。

 

映射引用属性

引用属性的意思是:持久化类的属性既不是基本数据类型,也不是String字符串,而是某个引用变量,该引用属性的类型可以是自定义类。

为了映射引用属性,Hibernate提供了component元素。每个component元素映射一个引用属性,引用属性必须指定该属性的类型。因此component元素要求具有class属性,该属性用于确定引用属性的类型。

一个自定义类通常还包括其它属性,因此还应该为component元素增加property的子元素来映射引用属性的子属性。

映射文件中的component还有unique=”true”属性,这并不是必须的,而是与具体的业务逻辑相关联的。

引用属性还有如下两种特殊的情况:

1.  集合属性的元素既不是基本数据类型,也不是String字符串,而是引用类型。

2.  持久化类的主键是引用类型。

 

具体分析:

1.  集合引用属性映射

对于有集合属性映射的POJO,都需要使用set,list,bag等集合元素来映射集合属性。如果集合里的元素是普通字符串,则使用element映射集合元素机可。如果集合元素是自定义类,则须使用component-element子元素来映射集合元素。

由于component-elemnet元素映射一个引用类型,因此需要增加class属性来确定集合元素的类型,该元素还支持以property的子元素来定义引用类型的子属性。

2.  引用类型主键的映射

如果持久化类需要使用引用类作为表示属性时,则该类应该满足以下两个条件:

a.       实现java.io.Serializable接口。

b.       重写equals()hashCode()方法,这两个方法的返回值都应该根据表中联合主键的列来判断。

引用类型主键的映射时,应使用composite-id元素,该元素需要class属性来确定主键的引用类型,并使用key-property元素来确定引用类型包含的基本属性。

(尽量不要使用这种复杂的标识属性,关于联合主键的映射还有一种策略,直接将多个属性映射成数据库主键)

3.  复合主键的映射

不使用一个引用类型来作为标识属性,而是使用原持久化类中的两个或多个属性联合使用来作为标识属性。

同样映射复合主键的持久化类也要满足第二点中的两个条件。

对于某个实例,如使用xxx1xxx2的联合能唯一标识该实例。那么hashCode方法和equals方法都根据这两个属性来判断。

如需映射xxx1xxx2两个标识属性时,同样可使用composite-id元素,此时的composite-id元素不需要nameclass属性,因为标识属性既没有实现类,也不是一个真实存在的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值