【IT168 专稿】面向对象的开发及关系数据库是当今软件开发的主流技术,他们基于不同的理论基础,各有优缺点,因此有效的把他们结合起来对一个系统的成功、优劣十分重要。 O/R Mapping(对象关系映射)就是将他们有效结合起来的先进技术。而在Java这个开放的世界里,O/R Mapping技术是五花八门,种类繁多。谁将成为Java世界里主流的对象关系映射技术?谁将承载Java ORM的市场重任呢?
首先列出英雄榜:
EJB(Enterprise Java Bean,企业级Java Bean)中的CMP(Container Management Persistence,容器管理持久化);
JDO(Java Data Object);
Hibernate。
出身名门的EJB
在走进EJB之前我们先说说大名鼎鼎的CMP吧。从家庭出身来开,CMP可谓系出名门,大家闺秀。其规范处于JCP的管理之下,拥有超豪华的专家组成员:Sun(Java的老祖宗)、IBM、Oracle、Borland、Bea、SAP、JBoss、Apache等等。单从这一点上来看,选它来进行O/R Mapping,技术支持应该无需担心了。当然向IBM, Bea等寻求项目咨询价格当然不菲。CMP是EJB中的一种,也是在O/R Mapping中应用最广泛的一种。从下图我们可以看出整个EJB的组成体系结构以及CMP在EJB中的地位。
EJB分为三种:Session Bean、Entity Bean、Message Driver Bean;其中Entity Bean又分为两种:BMP(Bean Management Persistence,Bean管理持久化)和CMP(Container Management Persistence,容器管理持久化)。BMP和CMP都具有O/R Mapping功能,但是由于BMP设计更为复杂,效率上也不如CMP,一般很少使用。因此EJB中的O/R Mapping主要是指CMP。从提供功能上来看,伴随着EJB的成长,CMP也经历了CMP1.0、CMP2.0和CMP3.0,功能也越来越完善了。包括完善的事务支持、EJBQL查询语言、透明的分布式访问等等。
不过作为一个重量级技术,J2EE的O/R Mapping标准是CMP,而实际应用中受到诟病最多的也是它。CMP的性能不太尽人意,这成为它备受争议的一个焦点。再有就是,它功能虽然强大,可是对于易用性来说,实在不敢恭维,写一个最简单的Bean,也非得Home接口,远程接口,要再加上2.0以后加入的本地接口,这么林林总总一大堆,足以让Java初学者望而却步了。但是这一点在一段时间内竟然也成了EJB功能强大,技术高深的“佐证”。不过CMP过于复杂这个缺陷在CMP最新版本——CMP3.0中得到了很大的改善。
英雄气短的JDO
下面新生代代表JDO隆重登场,JDO绝对属于年轻选手, JDO1.0也不过是2002年四月份才发布,2003年五月份出台1.0.1,目前最新2.0草案已经发布。就为这2.0,江湖上展开的讨论可以说是“血雨腥风”,两大兵团,JDO兵团和CMP兵团争得是不可开交。有兴趣的不妨去瞧瞧,里面也不乏重量级人物。单从这一点来看,它能对CMP产生这么大的冲击,足以说明了这个初生牛犊确有过人之处。JDO的诞生给Java O/R Mapping技术带来很多新特性,特别是它弥补了CMP对面向对象编程的先天不足,JDO提供了完全的面向对象支持:继承,多态。较之与CMP,JDO属于轻量级工具,无需容器支持。不像CMP,要用你就非得整一个Weblogic、Websphere之类的容器。
JDO的简单易用是最为人们所称道的,无需编写大量无用的接口,不需要继承什么特殊的类,唯一所要做的就是对你的类(Class)文件做一下Enhance。用了JDO,可以说我们的Java程序这下真正面向对象了,我们无需再理会数据库里面有些什么表格了,存取都是以Java Object为对象,所有数据库表格都是自动生成的。这一点可以说也是一次革命。
在此之前,项目设计阶段,Database Schema设计可以说是个重头戏。而现在用JDO开发,完全不需要数据库设计。那么,我们的Database Schema呢?就是Class啊,JDO会根据Class自动生成相应的数据库表格。从数据库可移植性来看,JDO也是优势明显,应用程序更换数据库时候除了换一个JDBC驱动,换一下数据库URL,无需对程序做任何改动。
这一点对CMP来说又是处于劣势。从家庭出身来看,JDO也是出生名门,从一开始就处于JCP管理之下。从企业级支持来看,它可以很好的和Session Bean协同工作,对于企业级开发,Session Bean + JDO的方式是Session Bean + CMP方式的一个强有力竞争对手。虽然有这么多优点,不过它的发展之路也非一帆风顺,IBM、Oracle、Bea三大巨头都不支持JDO。不过稍微一想,就可以理解,这并不是JDO本身技术有什么重大缺陷,而是JDO动到这些巨头们的奶酪了。
Hibernate草莽英雄
最后登场的是Hibernate。Hibernate就像武侠小说中的草莽英雄,虽然不是出身名门,没有得到江湖中成名已久的高手的指点,却凭着自己的智慧与勤奋,依靠千千万万开源工作者的支持,在O/R Mapping技术领域中打下一片锦绣河山。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate是一个独立的框架,不需要任何应用服务器的支持,也不需要部署描述符等文件,只需要一个配置文件和对应于持久类的映射文件即可实现O/R Mapping功能。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate支持EJB标准,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
下面,我们对以上三种O/R Mapping技术从三个方面进行一下比较总结。
首先,从家庭出身来看。CMP无疑是这三者之中出身最为高贵的,CMP是EJB标准的一部分,是众多大公司的宠儿;其次是JDO,JDO是Java的老祖宗——Sun推出的标准,其出身也算是豪门,但是JDO一直得不到其它Java领域的大公司的支持,原因是JDO动了这些巨头们的奶酪;较之于前面两种技术,Hibernate出身可谓贫寒,它是开源的产物,不是任何Java著名的标准的一部分。
其次,从技术层面上看。CMP存在明显的缺陷,诸如性能、不支持面向对象、开发难度大等;JDO与Hiberate很好的克服了CMP的缺陷。较之于CMP,JDO与Hibernate具有一下三个共同的优点:
兼容性:规范明确,而不同容器中的实现各不相同,这是CMP的现状。而JDO与Hibernate由于是轻量级组件,不需要容器的支持,其实现对于任何应用来说都是一样的,因此可以兼容任何Java应用;
灵活性:CMP通常需要重量级和高价位的应用程序服务器,而JDO和Hibernate无需应用服务器的支持;JDO和Hibernate对粗粒度和细粒度的数据对象设计都和适用;
面向对象特性:面向对象语言的精华——继承与多态,在CMP这里是行不通的,而JDO与Hibernate是完全面向对象的。
最后,从取得的成就和发展前景上看。Hibernate无疑是成就最大的,依靠千千万万开源工作者的支持,Hibernate从一个不知名的开源项目,发展到在许多应用(特别是中小型项目)中几乎完全取代CMP,成为O/R Mapping技术的首选,并且这种趋势仍然在继续;而CMP众多大公司的支持下,也取得了不俗的业绩,作为EJB标准的一部分,CMP现在依然是众多大型分布式项目O/R Mapping技术的首选。
相比之下,JDO几乎从来没有流行起来,其主要原因是既缺乏大公司的支持,也不被广大的程序员所接受。此外,Hibernate还有一个特别明显的优势就是它是开源的,有一个很好的免费的实现;而部署CMP需要在应用服务器上投入大量资金,而JDO则没有一个比较好的免费实现。这也是Hibernate流行的一个重要原因。