技术开发 频道

JDO技术分析及如何进入企业应用的研究

JDO高级应用
  
复杂对象的持久化
  
  在实际的应用中,一个可持久化类要远比Book类复杂很多。它可能会引用其它的Java类型、类、集合或数组,及可能复杂的继承关系。当这些对象的状态发生变化时,JDO是如何感知及跟踪状态变化?
  
  JDO提供了相应的API及规范来实现该功能。
  
基本类型及引用
  
  可持久化类的字段能被JDO实现进行持久化的原则。原始类型、java.util.Date等被支持(其它较为复杂或可选特性,详见JDO规范);如果引用是一个可持久类,则JDO进行持久化处理;通过元数据(如jdo文件)声明的字段,一般是非可持久化类的引用,JDO进行持久化;
  
  前面两种情形,当状态发生变化时,JDO会自动感知,但如果引用是非可持久化类,则需要代码进行显式通知,否则JDO不会将变化进行存储。如下例:
  
  public class Book
  {
   ……
      private Object picture;
      public void setPicture(Object pic)
   {
            picture = pic;
      }
      public Object getPicture()
   {
            Return picture;
      }
  }
  
  该类字段picture需要持久化,但java.lang.Object不是一个可持久类,故声明如下:
  
  <?xml version=1.0 encoding = UTF-8?>
  <!DOCTYPE jdo SYSTEM jdo.dtd>
  <jdo>
   <package name = business.model>
       <class name = Book >
            <field name=picture
        persistence-modifier=persistent/>
       </class>
   </package>
  </jdo>
  
  如果其它模块通过getPicture获得对象,并在JDO不可感知的外部,修改对象,则变化不会存储,较好的办法是修改setPicture方法,如下:
  
  public void setPicture(Object pic)
  {
   JDOHelper.makeDirty(this, picture);
   picture = pic;
  }
  
  并通过setPicture方法来更新数据。JDO的makeDirty方法,主要负责通知JDO实现,可持久化类Book某个实例(this)的picture字段发生了变化。
  
  集合
  
  可持久类的字段引用为集合时,按照JDO规范,强制支持java.util.HashSet,对HashMap、HashTable、TreeMap、TreeSet、LinkedList、ArrayList及Vector的支持对JDO实现而言是可选的,通过PersistenceManagerFactory的supportedOptions方法获得实现特性。
  
  数组
  
  如果可持久类的引用是数组类型,当数组单元发生变化时,需要调用makeDirty来通知JDO实现,该实例的数组引用内容发生了变化。与引用是非可持久类实例不同,不需要进行JDO的元数据声明。
  
  继承
  
  如果使用可持久性,一般继承的子类与父类都为可持久类,以减少系统复杂性,这时需要在子类的元数据中指出其可持久超类,如下:
  
  <
  class name=TechBook
  persistence-capable-superclass=Book/>
  
  可为非持久类扩展持久类,或可为持久类扩展非可持久类;这两种情形JDO实现都将忽略非
  
  可持久类的字段部分,而不保存到数据库。
  
JDO的一些不足之处
  
  JDO对数据的持久化技术相比于成熟的SQL,还有不足之处,这些不足在某些情况下将可能会影响数据处理部分的设计实现。以下列举了常用数据访问的必要功能
  
  查询增强
  
  如字符串不支持通配符、大小写比较;
  
  不支持聚合操作,无法实现MIN、MAX、SUM和AVG;
  
  不支持投影操作,JDO查询返回为对象,而不像SQL那样返回字段;
  
  不支持联合、交叉(UNION/INTERSECT);
  
  不支持JOIN、IN和EXISTS;
  
  企业应用探究
  
  由于JDO采用面向对象的持久化处理技术,从而为解决企业业务系统的持久化问题提供了一个新技术解决方案。但是先进的未必就最适用。在某些应用场景下,需要结合各种因素,采取灵活的策略。
  
  面向对象与面向记录
  
  现在大多业务系统都采用面向对象分析设计,这就需要每个应用系统都自行实现将对象映射成记录,并存储到数据库中,而有JDO这样的面向对象的持久化技术,在某种程度上解放了这种转化设计的不规范性,进而获得相对更优的系统结构。
  
  另一方面,一个业务系统的数据持久化,一般都有这样的过程:对象层->记录层->物理层,JDO无疑使分析设计人员从记录层的苦海中解脱出来,从而更加专注于对象层,这对开发人员无疑是一个令人欢欣鼓舞的技术。
  
  JDO并不能完全代替JDBC
  
  根据经典的8-2原理,如果用JDO来解决80%的问题,余下的20%由JDBC来实现,这种相互补充,各取所长的策略,是一个很有效的办法。
  
  这样一方面可以获得较好的结构及提升开发质量,另一方面解决了JDO的某些技术不足,并可根据以后的技术变化,再做适当转化。
  
  性能问题
  
  JDO与JDBC究竟谁的性能更优,目前还没有一个权威、且令人满意的答案。但对于一些JDO实现而言,通过采用缓存机制,使得性能有了较大提高。
  
  跨数据库
  
  使用JDO的系统能更好地进行数据库移植,甚至可以在对象数据库上运行;当然JDBC处理层如果完全遵循SQL-92标准,也同样具有很好的跨数据库能力。
0
相关文章