POJO 类和数据库的映射文件*.hbm.xml
POJO类和关系数据库之间的映射可以用一个XML文档来定义。
通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系。在运行时 Hibernate 将根据这个映射文件来生成各种SQL语句,映射文件的扩展名为 .hbm.xml。
映射文件说明
- hibernate-mapping
- 类层次:class
-主键:id
-基本类型:property
-实体引用类: many-to-one | one-to-one
-集合:set | list | map | array
one-to-many
many-to-many
-子类:subclass | joined-subclass
-其它:component | any 等 - 查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化)
- 类层次:class
下面对各个节点进行介绍
hibernate-mapping
class
在介绍下面的节点之前先来介绍一下映射对象标识符:
- Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据表的主键对应,Hibernate通过标识符生成器来为主键赋值。
- Hibernate 推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。
- 在对象-关系映射文件中, <id>元素用来设置对象标识符. <generator>子元素用来设定标识符生成器。
- Hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现。
id
generator
下面是hibernate提供的内置标识符生成器:
increment 标识符生成器
increment标识符生成器由Hibernate以递增的方式为代理主键赋值,Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为 1。
适用范围:
由于increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。
适用于只有单个Hibernate应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它。(并发问题)
OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常 。identity 标识符生成器
identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型。
适用范围:
由于identity生成标识符的机制依赖于底层数据库系统,因为要求底层数据库系统必须支持自动正常字段类型,这样的数据库包括:DB2,Mysql,MSSQLServer,Sybase等,不包括oracle。
OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。sequence 标识符生成器
sequence标识符生成器利用底层数据库提供的序列来生成标识符。
Hibernate在持久化一个News对象时,先从底层数据库的news_seq序列中获得一个唯一的标识号,再把它作为主键值 。
适用范围:
由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此, 要求底层数据库系统必须支持序列。支持序列的数据库包括: DB2, Oracle 等,不包括Mysql。
OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。hilo 标识符生成器
hilo标识符生成器由Hibernate按照一种“high/low”算法生成标识符。
Hibernate在持久化一个News对象时,由Hibernate负责生成主键值。hilo 标识符生成器在生成标识符时,需要读取并修改HI_TABLE表中的NEXT_VALUE值。
适用范围:
由于hilo生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。
OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。native 标识符生成器 (通常使用的方式)
native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity,sequence或hilo标识符生成器。
适用范围:
由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发。
OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。
property派生属性:
并不是持久化类的所有属性都直接和表的字段匹配,持久化类的有些属性的值必须在运行时通过计算才能得到,这种属性称为派生属性,下面我们使用property的formular属性来测试派生属性:
首先在News.java中添加一个desc字段:12345678910//该属性值为: title:authorprivate String desc;public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
然后在News的映射文件中映射派生属性:
测试:
运行结果: