【Hibernate步步为营】--详解基本映射
一、基本用法
Hibernate一个重要的功能就是映射,它能够在对象模型和关系模型之间转换,是面向对象编程思想提倡使用的,使用映射程序开发人员只需要关心对象模型中代码的编写。对象和关系数据库之间的映射通常是由XML文档来定义的。这个映射文档被设计为易读的,并且可以手动修改。这种映射关系我总结为下图:
映射是通过XML来定义的,使用Hibernate创建的session来管理,最后由session使用JTA把更改提交到数据库中。session可以理解为持久化管理器,管理持久层中的对象,它是由sessionFactory创建的。使用Hibernate编程时首先要连接数据库,所以首先要去查看xml中有关数据库连接的配置,根据文档的配置创建sessionFactory(可以理解为数据库镜像),再由sessionFactory创建一个session,最后由session统一将更改提交到数据库,这才完成了一部所有的操作。
二、基本用法
上文讨论了映射的基本内容,下面来看几个相关数据库配置的映射。其实这种映射并没有什么高级的地方,仔细想想它只是将数据库基本概念转换成了xml格式进行配置,使用过XML和数据库数据转换的开发人员应该就能很快的理解这种映射机制,它无非是一种格式的转换,并不是什么很高深的技术。思考只是帮助我们更好的理解,想要灵活的运用就必须实践,下面来介绍几种基本的数据库映射。
1、使用过程
(2)在映射文件中注册实体类,并将实体类的属性添加到映射类中,在添加属性时要指定两种值分别是id和property,id指明它是一个实体的唯一标示,property指明它是表的字段列;
(3)提交修改,同步数据。
Note:开发过xml数据转到数据库的开发人员很快就能理解这种映射其实是一种批量更新、批量创建的过程,映射也不例外,Hibernate规定了一套映射标准,按照标准就能够实现转换,它的内部实现还是死的,所以它只是相对的灵活易用。
(1)实体类User1的属性代码:
package com.hibernate; import java.util.Date; public class User1 { private String id; private String name; private String password; private Date createTime; private Date expireTime; public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getExpireTime() { return expireTime; } public void setExpireTime(Date expireTime) { this.expireTime = expireTime; } }
(2)User1.java的映射文件User1.hbm.xml的内部代码实现:
基础数据库中能够设置的在Hibernate中同样提供了设置的方法,可以使用标签属性来设置具体的映射关系。
类-->表使用class标签,常用属性:
name:映射实体类,它的值需要设置为需要转化成表的实体类的名称,在同步时会根据该属性查找相应的实体类。
table:映射数据库表的名称,如果要映射的表的名称和实体类名称不相同,使用该属性来指定映射的表,如果不存在的话会根据该属性值创建一个表。
查看上图中配置生成的表结构,如下图:
其中的表名更改为了t_user1;id字段更名为user_id,字段长度为32位;createTime属性,映射为数据库字段create_time,并修改为date类型。
属性-->字段使用id或property标签,常用属性:
name:功能类似于class标签的name,值定实体类的映射属性名;
column:类似于实体类class标签的table,指定映射表的列名称,如果不存在将会创建;
type:指定映射到数据库中字段的数据类型,根据需要查看文档即可;
generator,它是可选的,用来为一个持久类生成唯一的标识。
<id name="id" type="long" column="cat_id"> <generator class="org.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator> </id>
所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面介绍常用的几种:
identity:返回的标识符是long, short 或者int类型的。类似于数据库的自增字段。
sequence:在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。在整个数据库中自增,而不是单个的表中自增,需要指定单个的表中自增需要添加属性。
uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。类似于.NET生成的序列号。
native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。灵活的方式,会根据使用的数据库来确定使用的标识类型,MySQL会选择identity,Oracle选择sequence。
assigned:手动为实体类制定一个标识id。这是 <generator>元素没有指定时的默认生成策略。
foreign:使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
开发人员往往习惯了手动配置的方法根据文档的说明来编写配置属性,这样做很原始,初学者建议采用手动配置的方法,有助于思考。另外还有很多第三方工具,通过可视化的方法来配置然后生成xml配置文档,提高了开发效率,类似的工具如:XDoclet、Middlegen和AndorMDA。
结语
上文介绍了Hibernate的基本映射,并讨论了映射中经常用到的几个属性,使用上面的属性能实现对数据库最基本的操作,但在关系模型中还有很多叫复杂的关系没有讨论,如:多对一、一对多等,将会在下篇文章讨论。