当前位置:编程学习 > JAVA >>

JAVA域对象持久化技术的比较

本文是对Java常用域对象持久化技术的比较。在本文中介绍了域对象的概念,讨论了为什么要引入持久化技术,并对目前5种Java常用的域对象持久化技术进行比较,评价它们各自的优缺点和适用范围。

一. 应用程序的分层体系结构

3层结构是目前典型的应用软件结构,3层即表述层、业务逻辑层和数据库层。其中表述层提供与用户的交互界面,GUI和Web页面是表述层的两个典型的例子;业务逻辑层实现各种业务逻辑;数据库层负责存放和管理应用的持久性数据。

在上述的三层结构中,业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务数据的保存、更新、删除和查询操作。如果数据库改变或数据库的表结构发生变化,对业务逻辑层的影响非常大。为了把数据访问细节与业务逻辑分开,可以把数据访问作为单独的持久化层。持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API。完善的持久化层应达到以下目标:

? 代码可重用性高,能够完成所有的数据库访问操作;

? 能够支持多种数据库平台;

? 具有相对独立性,当持久化层发生变化时,不会影响上层的实现。

二. 软件的模型

在软件开发领域,模型用来表示真实世界的实体。在软件开发的不同阶段,需要为目标系统创建不同类型的模型。在分析阶段,需要创建概念模型。在设计阶段,需要创建域模型和数据模型。

构成域模型的基本元素就是域对象,即Domain Object,是对真实世界的实体的抽象。域对象可以代表业务领域中的人、地点、事务或概念。域对象包括3种:实体域对象、过程域对象和事件域对象。在三层应用结构中,以上3种域对象都位于业务逻辑层,实体域对象是应用的业务数据在内存中的表现形式,而过程域对象用于执行业务逻辑。

当实体域对象在内存中创建后,他们不可能永远存在,因此必须对域对象进行持久化。狭义的理解,“持久化”仅仅是把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库的各种相关操作,如:保存、更新、删除、加载、查询等。

三. Java中常用域对象持久化技术的比较

目前Java中共有5种常用的实现持久化的模式:

? JDBC直接访问数据库

? 主动域对象模式

? CMP模式

? ORM模式

? JDO模式

1、JDBC直接访问数据库

在这几种模式中JDBC的历史最为悠久,从Java诞生的那天起就有了JDBC,目前已经发展到JDBC3.0了。JDBC是一套规范,她规定了统一的标准接口,各个数据库厂商提供标准接口的实现。因此,只需要掌握标准的SQL语言就可以访问各种不同的数据库了。JDBC规范的出台,向世界宣告从此有了访问关系数据库的标准通用接口了。JDBC规范一经发布,获得了空前成功,很快成为java访问数据库的标准,JDBC获得了几乎所有数据库厂商的支持。这种数据库间的可移植性和Java一直高喊的口号Compile Once, Run everywhere遥相呼应。Java能有今天这么风光,JDBC可以说是功不可末。了。在没有JDBC的时候,各家数据库厂商都有自己的一套API,开发人员访问数据库非常困难,换个数据库,应用程序的修改量极大。JDBC今天还是java访问数据库的基石,本文中讨论的其他几种模式说到底只是更好的封装了JDBC, 提供了更为上层的更为强大的接口而已。

JDBC实现数据库访问的方式是在业务方法中直接嵌入SQL语句,SQL语句是面向关系的,依赖于关系模型。所以JDBC方式的优点是简单直接,特别是对于小型应用十分方便。

但是JDBC这种实现方式也给应用程序带来以下缺点:

(1)、实现业务逻辑的代码和数据库访问代码掺杂在一起,使程序结构不清晰,可读性差。

(2)、在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维来编写程序。

(3)、业务逻辑和关系数据模型绑定,如果关系数据发生变化,必须手工修改代码中所有相关的SQL语句,这曾经了维护软件的难度。

(4)、如果程序代码中SQL语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。

正是由于上述的缺点,为了使业务逻辑和数据访问细节分离,出现了下面的几种模式。

2、主动域对象模式

主动域对象是实体域对象的一种形式,它在实现中封装了关系数据模型和数据访问的细节。在 J2EE 架构中,EJB组件分为会话EJB和实体EJB。会话EJB通常实现业务逻辑,而实体EJB表示业务实体。实体EJB又分为两种:由EJB本身管理持久化,即BMP(Bean-Managed Persistence);由EJB容器管理持久化,即CMP(Container-Managed Persistence)。BM P就是主动域对象模式的一个例子,BMP 表示由实体 EJB 自身管理数据访问细节。

主动域对象模式有以下优点:

(1)、在实体域对象中封装自身的数据访问细节,过程域对象完全负责业务逻辑,使程序结构更加清晰。

(2)、如果关系数据模式发生变化,只需要修改主动域对象的代码,不需要修改过程域对象的业务方法。

主动域对象模式有以下缺点:

(1)、在实体域对象的实现中仍然包含SQL语句。

(2)、每个实体域对象都负责自身的数据访问实现。把这一职责分散在多个对象中,这会导致实体域对象重复实现一些共同的数据访问操作,从而造成重复编码。

主动域对象本身位于业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层应用结构,并没有从业务逻辑层分离出独立的持久化层。

3.CMP模式

在J2EE架构中,CMP(Container-Managed Persistence)表示由EJB容器来管理实体EJB 的持久化,EJB容器封装了对象-关系的映射及数据访问细节。CMP 和ORM的相似之处在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于CMP负责持久化实体EJB组件,而ORM负责持久化 POJO,它是普通的基于 Java Bean 形式的实体域对象。

CMP模式的优点在于:

(1)、他是基于EJB技术,是SUN J2EE体系的核心部分,获得了业界的普遍支持,包括各大厂商和开源组织等。如果选择它作企业级开发,技术支持会非常完备。

(2)、功能日趋完善,包括了完善的事务支持,EJBQL查询语言,透明的分布式访问等等

CMP模式的缺点在于:

(1)、开发人员开发的实体必须遵守复杂的J2EE规范,而多少ORM中间件没有类似要求。

(2)、实体域EJB只能运行在EJB容器中,而POJO可以运行在任何一种Java环境中。

(3)、尽管按照J2EE的规范,EJB应该是一种可移植组件,实际应用时确受到很大限制。而ORM中间件就不存在这样的问题。

4.ORM模式

ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。建模领域中的 ORM 为 Object/Role Modeling(对象角色建模)。另外这里是“O/R Mapper”而非“O/R Mapping”。相对来讲,O/R Mapping 描述的是一种设计思想或者实现机制,而 O/R Mapper指以O/R原理设计的持久化框架(Framework),包括 O/R机制、SQL自生成、事务处理和Cache管理等。

一般把基于 Java Bean 形式的实体域对象称为 POJO(Plain Old Java Object),意为又普通又古老的 Java 对象的意思。随着各种 ORM 映射工具的日趋成熟和流行,POJO有重现光彩,它和基于 CMP 的实体 EJB 相比,既简单又具有很高的可移植性,因此联合使用ORM 映射工具和 POJO,已经成为一种越来越受欢迎的且用来取代 CMP 的持久化方案。POJO的缺点就是无法做远程调用,不支持分布式计算。

常用的ORM中间件有:Hibernate、Apache OJB、Cayenne、Jaxor、TopLink等。其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准。

5.JDO模式

JDO是近几年新兴的数据持久性技术,Java Data Objects(JDO)是 SUN 公司制定的描述对象持久化语义的标准API。严格的说,

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,