选择JDO还是CMP?

类别:Java 点击:0 评论:0 推荐:
选择JDO还是CMP?

由孙宾译自http://www.onjava.com/pub/a/onjava/2003/05/21/jdo.html

作者:David Jordan 和 Craig Russell
著有《Java Data Objects》一书
2003年5月21日

  作者注:JDO和CMP方式的EJB目前正在同时向前发展,但采取的是不同的路线。JDO的核心思想是在企业应用软件架构的不同层面中存储传统的Java对象(Plain Old Java Objects,下称POJOs),而CMP方案则基于容器环境,并针对特殊的需求。

  两者之间的异同在规范出台之初便成为众所争论的话题。你可以到JDOCentral.com上看到这类的争论,而在6月中旬即将在旧金山开幕的2003年JavaOne大会上,也会有一些演示和讲解来比较这两种不同的技术。

  在这次JavaOne大会上,3368号技术对话将讨论JDO与Struts(一个著名的Web应用架构设计的开源软件)集成的可行性和实践经验;3236号专题研究JDO与EJB容器的结合;1289号专题将对比使用JDO、JDBC和EJB时,设计模式在开发中的应用。

  在我们的《Java Data Objects》的第17章有一小段话描述使用JDO和CMP的平衡点。--Craig Russell

 

JDO还是CMP?

  在你对项目开发策略下决定之前,CMP实体Bean和JDO都是值得考虑的方式。

  JDO对粗粒度和细粒度的数据对象设计都很适合,具体在一个应用服务器环境中,一般用于SessionBean后面。CMP也是用于SessionBean之后,它的远程调用很少直接用到。

  JDO编写的类只须编译一次就可用于分布式架构中的任何一层,并且在集成到Web或应用服务器之前可以以单层或两层的方式先调试好。而CMP只能在发布到一个具体的应用服务器后才能调试。

  JDO没有直接定义远程行为,这一点与Servlet、JSP和EJB组件不同。所有的分布处理、事务和安全方面的策略都基于独立存储管理器,该管理器负责处理你的对象模型中所有的类实例。这一点也说明你可以在分布式环境中的任何层面上使用JDO,而其远程行为由容器来实现,而不是JDO厂商。

  CMP组件提供了较高的可移植性,Bean类及其描述符都是规范化的。多数的不兼容性只存在于规范所未能尽述的地方,包括如何将类映射到具体的数据库(不限于关系数据库)、类似只读类的可选功能、其它方面的厂商扩展。而JDO产品视具体厂商所支持的可选功能而有所不同。

  CMP中,对象之间的关系是受控的,即一端的改变会影响到另一端,并且对应用是可见的。而JDO不支持关系的管理,只是一些厂商以扩展的方式提供类似功能。

  继承是对真实对象建模时常用的概念,但CMP并不支持它。CMP在组件的定义和实现时并不一致,在具体实现一个EntityBean接口时,实现的类可以具有继承关系,但在定义这个EntityBean时却不行。类之间的关系也只是在接口之间,而不是在实现类之间,因此这些关系也不存在多态性。举例来说,一个名为MediaItem的CMP Bean类不能直接联系到名为MediaContent的类,因为MediaContent是抽象的,类并无具体实例。要建立这样的联系,你只能将其转换为两个关系:一个是MediaItem与Movie类,一个是ModiaItem与Game类,并且在每个相关方法中,你必须针对两个关系区别对待。

  在访问对象属性上,CMP和JDO也天差地别。CMP Bean中,所有的属性和对象关系都是作为抽象的get和set方法定义在描述符中,对实际属性的访问只能由具体的由相关工具生成的实现类去完成。而JDO中,可保存的属性和关系在描述符中声明,并且在代码中也可以直接访问这些属性,包括JDO产品生成的代码在内。JDO增强器会在增强时适当地改造这些代码。

  JDOQL和EJBQL都提供了类似的查询数据的方法。两者都可以在程序中查询并访问数据对象,都采取“读-改-写”的策略,都不是完整的数据操纵语言(比如没有数据更新语句),它们都只用于查找数据对象并在代码中访问。

  CMP要求所有的访问操作都在事务环境中,非事务方式的访问不受支持。而JDO允许你决定是否采用事务方式。对需要更新数据的地方,JDO要求采用事务,而只是读取的代码中,包括缓冲在内,JDO支持非事务方式的访问。

  表17-1是对CMP Bean和JDO可存储类的比较

表17-1 CMP beans与JDO的比较

特性 CMP beans JDO可存储类 环境方面 应用可移植性 基本可以,很少有负面影响 规范定义的原则下可移植 应用环境 应用服务器 单层、两层、Web服务器、应用服务器 可存储类相对于环境的独立性 低:类必须实现EJB接口,并在EJB容器中执行 高:类不需要实现任何特定接口,可在任何环境中执行 元数据(metadata) 标记可存储类 发布描述符标明所有的可存储类 元数据标明所有可存储类 标记可存储属性 发布描述符标记所有的可存储属性和关系 元数据中默认大部分可存储属性和关系(简洁) 建模 域类的建模对象 CMP bean (抽象的底层数据库) 可存储类 域类间的继承 不支持 完全支持 属性访问 抽象的get/set方法 任何方式的访问,包括直接访问和get/set方法 Collection, Set 支持 支持 List, Array, Map 不支持 可选功能 关系 体现为对CMP本地接口的引用 体现为对JDO可存储类或接口的引用 多态性 不支持 支持 编程 查询语言 类似SQL的EJBQL 基于Java布尔判断的JDOQL 远程方法调用 支持 不支持 生命周期管理对类方法的要求

setEntityContext
unsetEntityContext
ejbActivate
ejbPassivate
ejbLoad
ejbStore
ejbRemove

无参构造器(可以是private的) 可选的回调方法 ejbCreate
ejbPostCreate
ejbFind jdoPostLoad
jdoPreStore
jdoPreClear
jdoPreDelete 关系数据库映射 厂商相关 厂商相关 方法安全策略 支持 不支持 方法的事务策略 支持 不支持 非事务访问 非标准 支持 需要的类/接口

EJBLocalHome,本地接口(如果支持本地访问)

EJBHome,远程接口(如果支持远程访问)

抽象类必须实现EntityBean

标识类(如果不是原始类型)

可存储类

标识类(只用于自定义标识)

事务同步回调 不支持 支持

  David Jordan创立了Object Identity, Inc.,提供Java Data Objects(JDO)的咨询和培训服务。David也是《Java Data Objects》一书的作者之一,另一作者是Craig Russell。

  Craig Russell是Sun微系统公司的JDO规范领导者。

  O'Reilly及其协会最近(2003年4月)出版了《Java Data Objects》。

第一章 概述,可以免费下载 你还可以查看该书的目录、索引和完整说明 以上两部分的中文版本:CSDN版,或JavaResearch版 (由孙宾翻译) 更多信息或购买该书,请看这里 。

本文的版权属于笔者本人,但欢迎转载,前提是注明出处和原作者。另外,欢迎在我的专栏中查看我的另几篇文章,并提出宝贵意见!

本文地址:http://com.8s8s.com/it/it17795.htm