映射文件的结构
映射文件的根元素为hibernate-mapping元素,这个元素下可以拥有多个class元素,每个class子元素对应一个持久化类的映射。
格式:
<hibernate-mapping>
<class/>
<class/>
……
</hibernate-mapping>
在class元素里:
Name属性:指定该持久化类映射的类名,应为全限定的类名。
(如果不使用全限定的类名,必须在hibernate-mapping元素里指定package属性,用来指定持久化类所在的包名)
(如果需要采用继承映射,则class元素下还会增加subclass元素,joined-class或union元素,这些元素分别用于定义子类)
id元素:用来标识属性用来标识该持久化的实例,因此标识属性通常被映射成数据表的主键。
(id元素的name属性的值就是持久化类标识属性名)
主键生成器
主键生成器是负责生成数据表记录的主键,有如下几种常见主键生成器:
Increment:对long,short,int的数据列生成自动增长主键。(性能低下,一般不用)
Identity:对如SQL Servlet,MySQL等支持自动增长列的数据库,如果数据列的类型是long,short,int,可使用主键生成器生成自动增长主键。
Sequence:对如Oracle,DB2等支持Sequence的数据库,如果数据列的类型是long,short,int,可使用主键生成器生成自动增长主键。
Uuid:对字符串列的数据采用128位uuid算法生成唯一的字符串主键。
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. 复合主键的映射
不使用一个引用类型来作为标识属性,而是使用原持久化类中的两个或多个属性联合使用来作为标识属性。
同样映射复合主键的持久化类也要满足第二点中的两个条件。
对于某个实例,如使用xxx1和xxx2的联合能唯一标识该实例。那么hashCode方法和equals方法都根据这两个属性来判断。
如需映射xxx1和xxx2两个标识属性时,同样可使用composite-id元素,此时的composite-id元素不需要name和class属性,因为标识属性既没有实现类,也不是一个真实存在的属性。