选择JDO还是CMP?

java持久层框架对比 立即下载

选择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 beansJDO可存储类
环境方面
应用可移植性基本可以,很少有负面影响规范定义的原则下可移植
应用环境应用服务器单层、两层、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》。

。

本文的版权属于笔者本人,但欢迎转载,前提是注明出处和原作者。另外,欢迎在 我的专栏中查看我的另几篇文章,并提出宝贵意见!
在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL) 在Windows11上安装ubuntu版linux系统并实现桌面图形化(WSL),xfce桌面美化、安装google-chrome 阅读详情

相关推荐

LLaVA-1.5:多模态视觉问答新突破

LLaVA-1.5在多模态视觉问答(VQA)任务中取得了显著进展,主要得益于视觉-语言连接器的优化和特定任务数据集的增加。通过将连接器升级为两层MLP,模型在处理视觉与语言关系时表现更佳。同时,引入如OKVQA、OCRVQA等数据集,增强了模型在复杂视觉推理任务中的能力。在11个基准测试中,LLaVA-1.5超越了现有方法,展示了其强大的多模态能力。此外,模型通过提升输入图像分辨率、扩展语言模型和改进多语言能力,进一步提升了性能。尽管在短格式回答任务中初期表现不佳,但通过调整提示格式和微调,其性能显著提升

weixin_57060548的博客 945

JDO快速入门

<br />JDO快速入门Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语句。JDO是作为Java数据库连接(JDBC)的一个补充来介绍的,而JDBC是一个支持使用SOL语句对流行的数据库程序进行访问的接口。有了 JDO,程序员就可以使用类来定义数据对象,然后支撑程序就会根据类的定义来管理对给定数据库的实际的数据访问了。  <br /><br />      JDO是以Sun

liuzhigang1237的专栏 1万+

Docker “docker login“ 失败? 登录阿里云镜像仓库仓库 unauthorized: authentication required

文章目录听说你 login fail?来,让我们解决一下!登录,撒花 听说你 login fail? 美滋滋的在服务器上安装完成Docker应用,开始配置阿里云镜像加速?然后被阿里云官方文档蹂躏?别急别急,让我来拯救你。 我们先来看看 阿里云官方文档 Docker镜像基本操作: 好家伙,emmm… 上来直接就Login Succeeded,这不简直so easy?我们也来照着操作操作: docker@default-online:~$ docker login registry.cn-hangzhou.a

zhuzicc的博客 1万+

JDO、EJB/CMP、Hibernate和Amber的比较

 作者: liu2liu2     来源: 追忆似水年华 来自:http://www.matrix.org.cn/blog/liu2liu2JDO的优点:●  JDO的生命周期状态机(lifecycle state machine)是正确的用法。任何其它的O/R映射工具都应该使用JDO的生命周期或者它的子集(例如:如果不支持事务)。记住,JDO生命周期是为JDO实现服务的。大部分用户不需要了解

MiTKooK's Tech Log 975

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

新手必看:如何用R/qtl快速完成QTL定位分析(附实战代码)

本文为新手提供了使用R/qtl进行QTL定位分析的完整实战指南。内容涵盖从环境搭建、数据准备与清洗,到核心分析流程(包括遗传图谱计算、单QTL扫描、置换检验确定阈值)以及进阶结果可视化的全步骤。通过清晰的代码示例,帮助读者快速掌握这一数量遗传学关键分析技术,实现从数据到QTL峰值的完整分析闭环。

y7z8a的博客 501

用JDO替代CMP的应用

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 522

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 138

Hibernate、JDO、CMP等技术的热烈讨论

[url] http://www.jdon.com/jive/thread.jsp?forum=16&thread=6062&start=0&msRange=15[/url] [url]http://www.theserverside.com/discussion/thread.jsp?thread_id=19732[/url]

pkk2004的专栏 207

PICO G2 4K Unity开发环境配置完全指南

VR开发中,Android平台的硬件适配与Unity版本兼容性是基础性技术命题。PICO G2 4K作为基于骁龙845+Android 8.1的专用VR一体机,其开发链路高度依赖特定Unity LTS版本(2020.3.41f1)、NDK r21e及OpenJDK 11等工具链组合,本质是嵌入式Android VR Runtime与Unity IL2CPP ABI的深度对齐问题。该配置方案不仅解决ADB识别、APK签名、Logcat捕获等工程痛点,更支撑手柄6DoF追踪、射线交互、Haptic反馈等核心XR

weixin_30298497的博客 617

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3837

JDO与Hibernate之比较(转载)

来自:http://blog.youkuaiyun.com/yiyo2025/article/details/466411 在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+ DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上...

java开发指南博客 【转载】 128

史上最详细的sqlmap使用教程

sqlmapsqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等Sqlmap采用了以下5种独特的SQL注入技术基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。

大河之犬的博客 5万+

做项目为什么要学习Hibernate

在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上来,这主要体现在多表的关系无法直接映射到对持久对象的映射上来,可能是一个表映射多个持久对象,有可能是多个表映射一个持久对象,

thinkpadleo的专栏 1067

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

为什么要学习Hibernate?

做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上来,这主要体现在多表的关系无法直接映射到对持久对象的映射上来,可能是一个表映射多个持久对象,有可能是多个表映射一个持久对象,更有

ALAN的专栏 368

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

我为什么要学习Hibernate?

      在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上来,这主要体现在多表的关系无法直接映射到对持久对象的映射上来,可能是一个表映射多个持久对象,有可能是多个表映射一

kaile8324的专栏 839

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hibernate介绍之一 (转)

 在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上来,这主要体现在多表的关系无法直接映射到对持久对象的映射上来,可能是一个表映射多个持久对象,有可能是多个表映射一个持久

Roger★L☆M☆J★ 539

我为什么要学习Hibernate

http://35java.com/zhibo/forum.php?mod=viewthread&tid=360&extra=page%3D3 在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表...

iteye_772的博客 117

我为什么要学习Hibernate?

在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要么用CMP,要么用JDBC+DAO。 CMP就不用说了,它对我来说是一种失败的实践,而JDBC+DAO也存在很多的困难,我很难做到把关系表记录完整的映射到持久对象的关系上来,这主要体现在多表的关系无法直接映射到对持久对象的映射上来,可能是一个表映射多个持久对象,有可能是多个表映射一个持久对象,

Bob@优快云 544

为什么要学习Hibernate(zz)

为什么要学习Hibernate(zz)   在我做过的很多项目的过程中,我一直有一个悬而未决的问题在困扰我,那就是持久层的开发。持久层的开发一般来说要

Roy'space 860

数据持久化(转)

何谓“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 何谓“持久层” 持久层(Persistence La

pgbiao的专栏 635

2004开发技术年度综述之Java世界

2004年Java世界发生了巨大变化,主要方面是诞生和发展了几个新名词:IOC 、AOP、SOA、MDA,当然,除了这些都是决定Java技术未来走向的革命性发展以外,还有很多细部和微观的发展,我们先来谈谈这些重要的细节技术发展。  首先, Java的根基JDK已经跨越到了J2SE 1.5,或者称为J2SE 5.0,不过,我更喜欢称它为1.5,延续性是我们应用程序员更关心的,当然革命性是那些新技术发

软体疯子专栏 1146

J2EE持久性:JBoss选择了JDO

J2EE应用中,数据层用什么技术?这是个争论已久的问题。Sun的资料中总是强调:“我们希望开发者使用Entity Bean管理数据的持久性问题。”但是很多人认为Entity Bean并不是一个好的解决方案,他们或许更喜欢JDO(Java Data Object)。当然,还有些人宁可使用第三方的O/R mapping框架(例如Hibernate)。持久化管理,这虽然不是我擅长的技术范围,不过看着别人

透明思考@优快云 2015
上一篇: JDO能给我们带来什么
下一篇: 最权威的JDO新书《Java Data Objects》(不同于Robin Roos的那本)
sun2bin
博客等级 码龄25年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值