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实现而言,通过采用缓存机制,使得性能有了较大提高。
跨数据库
0
相关文章