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标准,也同样具有很好的跨数据库能力。
热卖推荐:
手机 诺基亚 MP5 电脑包 双卡双待 手机链 U盘 笔记本电脑