JDO 的架构作一个简单的介绍

本文介绍了JDO(Java Data Objects)的架构,包括JDO接口如JDOHelper、PersistenceManagerFactory、PersistenceManager等的使用,以及JDOQL查询和事务处理。JDO提供了透明数据库访问和高性能的数据持久化,可以与EJB集成,并与JDBC互补。文章还提到了JDO对象的生命周期和不同类类型的角色。
摘要由CSDN通过智能技术生成

JDO快速入门

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

      JDO是以Sun公司为首所制定的Java Community Process(Java标准制定组织,JCP)的一部分。JDBC仍然保留使用是因为它比起JDO允许程序员在数据库访问上有更大的控制权。除JDO和 JDBC外的另一个选择是Enterprise JavaBeans (EJB)。

一、为什么要用JDO

Java开发人员已经有好几种存取数据库的方法:序列化,JDBC,面向对象映射工具,面向对象数据库,以及实体EJB。那为什么还要介绍其他的存储架构呢?答案是,上面每一种实现存储的方案都存在一定的限制。JDO正在尝试解决这些限制。


序列化:是Java建立的一种传输机制,它能够把对象的信息转换成一系列的字节码,这些字节码可以被传输到网络或者存储到一个文件中。序列化的使用非常简单,但他还是有限制的。它必须立即存取对象的特征,而且它不适合存取大批量的数据。在更改一个对象的属性时如果有错误发生它无法实现“回滚”,因此不适于应用程序对数据完整性的要求,而且不能实现多个线程或程序异步读写数据。所有这些不足都使得序列化无法满足大多数数据存储要求。


JDBC:许多程序员使用 JDBC API来操作关系数据库。JDBC克服了许多序列化中存在的缺点:它可以操作大批量的数据,有确保数据一致性的机制,支持信息的并发存取,可以使用已经非常成熟的SQL语言。不幸的是,JDBC使用起来并不像序列化那么简单。JDBC使用的关系范例无法用于存储对象,因此你不得不放弃在代码中使用面向对象原则存储数据。


面向对象映射工具:由软件厂商创建的架构可以为你实现对象和关系数据库之间的映射。这种对象-关系映射支持使你专注于对象模型的设计而不必关心面向对象和关系数据库之间的匹配。不幸的是每一种对象-关系映射产品都有一套他自己厂商实现的标准。你不得不使自己的代码迁就于某一个单独厂商的实现。假如这个厂商提高产品价格或者停止对bug更改的支持,使你准备放弃它而用其他的厂商实现架构时,你就必须重写你的代码。


面向对象的数据库:比对象关系数据库映射更好的选择使使用一些软件厂商开发了一种新的把对象存储到数据库的方法。这种面向对象的数据库使用起来常常比对象关系映射软件简单。ODMG组织成立的目的之一就是创建一种访问对象数据库的标准API。多数厂商都遵崇ODMG组织的要求,因此由于厂商实现不同带来的麻烦也解决了。但是,一些企业对于从关系数据库转向对象数据库显得犹豫不决,因为有大量的数据存储在传统的关系数据库中。虽然一些数据库分析工具可以用于面向对象数据库与关系数据库之间的移植,然而大量的数据存储使用的仍然是关系数据库。


实体EJB:Java平台的企业级应用中引入了实体EJB。实体EJB是一个组件,他描述了数据库中的持久性数据信息。EJB使用类似于对象-关系映射的办法,它提供了一个持久性数据的面向对象的表示。不同于对象关系软件,EJB对于关系数据库没有限制;它描述的持久性信息可以来自一个企业信息系统(EIS)或者其他的存储设备。而且,EJB要求遵循一个严格标准,实现它的厂商必须遵循这个标准。不幸的是,EJB标准在面向对象方面稍微有些欠缺,比如一些高级的特性:继承、多态和复合关系等。另外,EJB的代码编写很复杂,而且它是一个重量级组建需要消耗应用服务器很多的资源来运行。但是,EJB中的会话 Bean和消息驱动Bean有很多优势,所以JDO规范详细定义了JDO如何与他们进行集成。


JDO:JDO集成了很多上述持久性机制的特性,这使得在JDO中创建一个持久化(persistence)类就像创建一个序列化类一样简单。JDO支持批量数据的存储,数据一致性,并发处理和JDBC的查询功能。就像对象-关系映射软件和对象数据库一样,它允许使用面向对象的高级特性比如“继承”。它避免了像EJB中实体Bean一样必须依赖于来自厂商定义的严格规范。同EJB一样,JDO也不规定任何特定的后端数据库。

但是,这里还是要说一下,世界上没有“万灵丹”。所以,使用JDO并不是对于每一个应用程序都是有好处的。很多应用程序完全可以使用其他更理想的存储机制。

二、JDO架构

下面我开始对JDO的架构作一个简单的介绍。

下图显示了JDO架构主要的几部分:


JDOHelper :javax.jdo.JDOHelper类拥有一些静态的助手(helper)方法。这个方法可以获得一个持久对象的生命周期还可以用来创建一个与具体实现厂商无关的PersistenceManagerFactory的实例,这里使用了工厂(factory)模式。

PersistenceManagerFactory:javax.jdo.PersistenceManagerFactory类可以通过JDOHelper类的助手方法获得,这是一个标准的工厂类,他可以创建PersistenceManager类。

PersistenceManager:javax.jdo.PersistenceManager接口是应用程序经常要使用的一个主要的JDO接口。每一个PersistenceManager负责控制一组持久化对象而且他还可以创建新的持久化对象或删除现有的持久化对象。Transaction和 PersistenceManager之间存在这一对一的关系,同时PersistenceManager又是Extent和Query的工厂类,也就是说这两个对象可以通过PersistenceManager创建。

PersistenceCapable
:用户定义的持久化类都必须扩展实现PersistenceCapable接口。大多数JDO实现的供应商都提供一种“增强器”(enhancer)的功能,它可以向你要实现的持久化类中增加PersistenceCapable接口的实现。也就是说,其实你根本不会自己去实现这个接口。

Transaction:每一个PersistemceManager和javax.jdo.Transaction都是一一对应的。Transactions用来处理事务,它使得持久化数据可以成批的一次性添加到数据表中,如果出现异常就将数据回滚。

Extent:java.jdo.Extent是映射数据库中具体表的类的一个逻辑视图。Extent可以拥有自己的子类,它通过PersistenceManager获得。

Query:java.jdo.Query接口用具体的厂商JDO来实现,它负责处理JDO查询语言(JDOQL),这些JDOQL最终被解释为实际的数据库SQL语言。同样这个接口也是通过PersistenceManager获得的。

下面的例子显示的JDO接口如何操作并执行一个查询并更新持久化对象。


例子:JDO接口的交互

//通过助手类获得PersistenceManagerFactory

PersistenceManagerFactory factory=
JDOHelper.getPersistenceManagerFactory(System.getProperties());

//通过PersistenceManagerFactory获得PersistenceManager对象

PersistenceManager pm=factory.getPersistenceManager();

//创建并开始一个事务

Transaction tx=pm.currentTransaction();
tx.begin();

//查询employee表中每周工作时间大于40小时的研究人员

Extent ex=pm.getExtent(Employee.class,false);

//获得一个Query

Query query=pm.newQuery();

//设置这个query作用的范围,即查询的是那个表或记录集

query.setCandidates(ex);
query.setFilter(division.name == /Research/ + && avgHours > 40);
Collection result=(Collection)query.execute();
Employee emp;
for(Iterator itr=result.iterator();itr.hasNext();){
emp=(Employee)itr.next();
emp.setSalary(emp.getSalary()*2);
}

//提交记录释放资源

tx.commit();
pm.close();
factory.close();
 


上面的代码片断包括了JDO几个主要的接口,在此你可以对JDO各个接口的使用方法有一个粗略的印象,以后实际的应用中JDO接口也都是这样使用的。


三、JDO的异常

JDO不会抛出通常的运行时异常,比如NullPointerExceptions、 IllegalArgumentException等它只抛出JDOException异常。JDOExcetion的结构如下图所示,这是一个继承的层次结构,从他们的字面含义就可以看出它们的用途,在这里就不详细说了,要想了解JDO异常的层次结构可以参考它们的JavaDoc。


四、使用JDO的好处

·简便性(Portability):使用JDO API编写的程序可以在不同开发商的多种可用的实现上运行,不用修改一行代码,甚至不用重新编译。

·透明地访问数据库(Transparent database access):应用程序开发者编写代码透明地访问底层数据存储,而不需要使用任何数据库特定代码。

·易用性(Ease of use):JDO API允许开发者只需要关注他们自己范围内的数据模型(Domain Object Model,DOM),而持久化的细节就留给JDO实现。

·高性能(High Performance):Java应用程序开发者不需要担心数据访问的性能优化,因为这个任务已经委派给了JDO实现,它通过改善数据访问的模式以获得最佳性能。

·和EJB集成(Integration with EJB):应用程序可以利用EJB的特征,例如远程信息处理、自动分布式事务协调和贯穿整个企业级应用使用同样的DOMs实现安全性。

五、使用JDO,vs. EJB和JDBC

JDO并不意味着要取代JDBC。它们是两种以各自独一无二的能力互相补充的技术,具有不同技术背景和开发目的开发者可以使用二者中的一个。例如。JDBC通过直接的数据库访问控制和缓存管理,提供给开发者更大的弹性。JDBC是一种在工业界被广泛认可的成熟技术。另一方面,JDO,通过隐藏SQL提供给开发者更大的简便性。它将Java平台开发者从必须熟悉或学习SQL中解脱出来,而将精力集中在 DOM上,同时JDO管理在持久存储中对象存储的字段到字段的细节。

JDO被设计成EJB的补充。CMP为容器提供简便的持久化,而JDO可以以两种方式集成到EJB 中:

(1)通过会话Bean,它含有JDO Persistence-capable类(会话Bean的持久化助手类)用来实现依赖对象;

(2)通过实体Bean,它含有被用作BMP和CMP代理的 JDO Persistence-capable类。

你可以学习更多关于JDO和JDBC之间的关系,还有EJB2.0 CMP和JDO之间的关系。

六、POJO之路

JDO和 EJB之间在持久化模型上显著的差别曾经在开发者中间引起了混乱。作为回应,Sun微系统正领导一个社区项目为Java技术社区创建POJO持久化模型。这个项目在JSR-220的赞助下执行,由Linda DeMichiel领导。JDO2.0(JSR-243)的专家组成员被邀请加入到EJB3.0(JSR-220)专家组中。

创建POJO持久化模型的目的是为所有使用Java SE和Java EE平台的Java应用程序开发者提供一个对象—关系(object-relational)映射工具。值得注意的是Oracle正以co- specification lead的身份加入到Sun EJB3.0。EJB3.0的公众评论草案已经可以得到。

JSR-243(JDO2.0)遵循了那些来自于JSRs220和243规范的领导写给Java技术社区的信件所描述的轮廓。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常生果

喜欢我,请支持我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值