(一) ORM简介
1.1 ORM的技术背景
对象---关系映射(ORM)是一种为了解决面相对象与关系数据库存在的互不匹配的现象的技术。简单的说,对象---关系映射(ORM)是通过使用描述对象与数据库之间映射的元数据,将面向对象程序自动持久化到关系数据库中。本质上是将数据从一种形式转化到另一种形式,这也同时暗示着额外的执行开销。然而,如果对象---关系映射(ORM)作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。更重要的是用于控制转化的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守对象数据管理组织(ODMG)规范的对象数据库依然需要类级别的元数据。
对象---关系映射(ORM)是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存放系统,对象和关系数据是业务实体的两中表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象---关系映射(ORM)系统一般以中间的形式存在,主要实现程序对象到关系数据库数据的映射。
众所周知,面向对象的建模和设计过程的重要指导原则之一就是对象的继承。然而在关系数据库中,缺乏合适,简单的手段来反映这种对象之间的继承关系。阻抗不匹配使软件开发者在描述对象和关系数据库转换时面临的一个关键问题,这也是对象持久化过程中非常难于处理的一个环节。
关系模型把数据组织成行和列,每行表示一条记录,而列则表示为记录中的各种数据项,如果软件系统中数据过于复杂以至于不能用二维的表格来描述,则需要添加附加的表来表示数据之间的“关系”信息。因此,在关系模型中的每一张表都掌握一些数据,而不是全部的数据,而真正的数据可能需要有非常多的记录和数据项来表示。
对象模型中的每个对象都完的整的描述一个特定类的信息,而不拘泥于在行和列中保存数据。表示对象的每一条都是该对象的特定的实例,因此每一个对象都包含了描述自身的所有数据项,与此同时,对象的定义还可以包含一段代码,叫做方法,来进一步诠释对象,而关系模型里面没有这种概念。
对象模型与关系模型之间这种基本的差异导致两种模型的结合并不理想,于是人们试图采用对象数据库来解决两者之间的问题。但是关系数据库技术在现阶段已经发展得相当成熟,占据数据库市场上90%以上的份额,而对象数据库的普及尚需要时日。数据持久层就是要在对象---关系数据库之间提供一个成功企业级别的映射解决方案,尽最大的可能弥补这两种范例之间的差异。
1.2 ORM的基本概
念对象--关系映射(ORM)弥合了所谓的对象关系阻抗不匹配:设计良好的面向对象的模型(基于对现实世界的事物与概念进行建模)与数据库模式中的关系模型(基于数学的数据存储方法)之间的鸿沟。
对象—关系映射(ORM)由持久性工具执行,该工具知道如何查询数据库来检索对象,并知道如何将这些对象持久保存为它们在数据库表和列中的表示,映射在元数据(通常是XML文件)中定义。
1.3 ORM工具及评价标准
采用对象--关系映射(ORM)技术成功与否的关键之处在于对象--关系映射工具自身的好坏. 目前流行的对象—关系映射(ORM)工具有Hibernate,JDO iBATIS
那么如何来判别对象—关系映射(ORM)工具的优劣?可以从以下对象--关系映射(ORM)工具的5个特性来判断:
1.实体映射
开发者将数据库中的实体(一般是一张表)映射为类,对数据库的操作直接转换为对这些实体对象的操作,包括新建,读取,更新,删除(CRUD)等。采用对实体对象的操作,而不是对数据库的直接操作,可以使的数据库访问更方便,并能减少大量不必要的代码。
2.关系映射
数据库中多个表之间会有相互的关系,怎样把这些关系也反映到映射好的实体类中,这就是关系映射。不过相比实体映射,关系映射实现起来更难,这也是评估不同对象—关系映射(ORM)工具好坏的一个重要因素。
3.高级查询
在数据库操作中,用的最多的是数据获取(Retrieve)。数据查询条件复杂,并且查询结果根据不同业务有不同的要求,并不是简单的获取表的所有字段,这也是对象—关系映射(ORM)实现最关键的地方,则使用起来也有难有易
4.事务处理
在数据可靠性要求高的时候,需要引入事务,多数对象—关系映射工具都必须支持事务处理。
5.实体类和操作类的生成
对象—关系映射(ORM)工具说到底就是帮我们生成一个功能强大的数据库访问类,里面包括实体对象类,实体操作类等,为了实现代码的统一及自动化,代码生成的质量也是非常关键的。一个优秀的对象--关系映射(ORM)框工具要搭配一个好的代码生成工具。
(二) Hibernate的体系结构及对象关系映射
2.1 Hibernate的简单描述
Hibernate主要由持久化对象,配置文件和对象—关系映射文件组成,如图:
应用程序 |
Hibernate |
配置文件 Hibernate.cef.xml |
XML映射文件 *.hbm.xnl |
数据库 |
持久化对象(POJO) |
从图中可以看出,应用层抽象出业务的POJO对象并通过Hibernate及映射文件的定义来实现其业务对象的持久化管理。
2.2 基本映射的实现
2.2.1.类名与表名映射
例如:
<class name =””com.hbp.chapter3.model.user” table=””app_user”>
其属性如下:
(1)<class>节点用来声明类名与表名的映射;
(2)name属性指定了映射的类名com.hbp.chapter3.model.user;
(3)table属性指定了映射的数据库表名app_user;
通过此节点配置,Hibernate便可知道类与表的映射关系,也就是对象与关系数据库表的映射。
2.2.2.主键映射
例如:
<id name =”id” column=”id” type=”long” unsaved-value=”null”>
<generator class=”native”/>
</id>
其属性如下:
(1) <id>节点用来声明实体类的标示符(identity)与数据库表主键的对应;
(2) name属性指定了实体类中的主键名称;
(3) column属性指定了对应映射表中的主键字段名;
(4) type属性指定了主键的类别;
(5) <generator>节点指定了主键的生成方式,class属性指定了具体的生成方式。