`

对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。

  
  • 大小: 17.3 KB
分享到:
评论
3 楼 mht19840918 2008-02-27  
JDO没有一个好的开源免费实现,好的产品都是商业产品,并且在国内没有销售和技术支持。这就造成了JDO只有学习之用,不能把它用在实际项目中,否则的话,你把软件卖给客户的时候,还要告诉他,你还要另外去买一个国外的软件产品,并且在国内没有技术支持,出了持久层的问题,我们也解决不了,请你自己打国际长途去解决问题,你认为客户能答应吗?
我在此提出它,扩大认识面,就像XMLHttpRequest一样,当年微软设计它的本意也不是针对ajax的,也是一个偶然被人从古董堆翻出来的,说不定那天我们能用到它的思想,呵呵。

希望和诸位多交流~
2 楼 mht19840918 2008-02-27  
JDO的标准很不完善,存在重大缺陷。最主要的问题体现在PO不能脱离PM(相当于 Hibernate的Session)而存在,这是个非常严重的问题,会造成编程的时候进行大量VO的拷贝操作,烦琐极了;另外一个重大缺陷是静态的 POJO的Enhancer,不能运行期动态Enhance,无法进行增量编译和调试,编程和调试起来非常烦琐,每次都要手共运行一个工具对POJO进行 Enhance;此外还有一些缺陷,例如JDOQL不完善,映射关系的表达不够强大等等。Hibernate的源代码非常少,而且写的非常简洁,我总觉得挺奇怪的,这么少的源代码能够实现这么多的功能,是个奇迹。 Hibernate的源代码树分的很清楚简单,源代码很易读,我一旦碰到文档中没有讲到的问题,或者文档中提到但是我搞不清楚的地方,我就去源代码中找,所有的问题都豁然开朗,而且让我对Hibernate的运行原理和细节搞的特别清楚,好像Hibernate就像自己写的代码一样,很清楚的知道,怎么写程序可以让Hibernate运行效率最高,最省内存,程序出了错误,很清楚的知道是什么地方的问题,怎么解决。
1 楼 qichunren 2008-02-27  
你用过它没有啊?感觉和Hibernate比起来如何啊?

相关推荐

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    Web开发+java+ssh框架

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    详细介绍 jpa 开发文档

    1.3 Java数据对象(Java Data Object,JDO) 2 1.4 Java Persistence API(JPA) 2 2. JPA体系架构 3 清单1在非Java EE环境使用JPA接口的例子 5 清单2在容器中运行的JPA例子 5 3. Entity Bean 6 3.1定义对Entity中...

    超级有影响力霸气的Java面试题大全文档

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    Java面试宝典2010版

    10、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 11、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp...

    最新Java面试宝典pdf版

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    Java面试笔试资料大全

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    JAVA面试宝典2010

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    Java面试宝典-经典

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    java面试题大全(2012版)

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    Java面试宝典2012版

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用...

    java面试宝典2012

    13、是否可以从一个static方法内部发出对非static方法的调用? 13 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 14 16、下面的代码有什么不妥之处? 14 17、请说出作用域...

    Java面试宝典2012新版

    13、是否可以从一个static方法内部发出对非static方法的调用? 12 14、Integer与int的区别 13 15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13 16、下面的代码有什么不妥之处? 13 17、请说出作用域...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    精通Hibernate:对象持久化技术第二版part3

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    JPA开发手册Word版

    1.3 Java数据对象(Java Data Object,JDO) 2 1.4 Java Persistence API(JPA) 2 2. JPA体系架构 3 清单1在非Java EE环境使用JPA接口的例子 5 清单2在容器中运行的JPA例子 5 3. Entity Bean 6 3.1定义对Entity中...

    JPA开发手册

    1.3 Java数据对象(Java Data Object,JDO) 2 1.4 Java Persistence API(JPA) 2 2. JPA体系架构 3 清单1在非Java EE环境使用JPA接口的例子 5 清单2在容器中运行的JPA例子 5 3. Entity Bean 6 3.1定义对Entity中...

Global site tag (gtag.js) - Google Analytics