JDO是什么-J2EEJ2ME教程
转载自:互联网 作者:cd3c.com
您正在看的J2EEJ2ME教程是:JDO是什么。
JDO是Java对象持久化的新的规范。JDO经SunJava Community Process认定。
一、历史
JDO是对象持久化工作的综合成果,试图提供一个对象持久化的完全版本。JDO同时继承于ODMG(对象数据管理小组,标准化对象数据库的一个独立委员会)和对象关系映射工具提供商。
JSR #000012 approved in July 1999
1999-8组建的专家小组:包括Sun、Apple、BEA、IBM、Oracle、SAP、WebGain等
2000-5 完成公开评论草案
2000-6 在JavaOne上引入
2001-3 最终草案0.93
2001-5 最终草案0.96公布
2001-6 在JavaOne上启动
2001-11 最终草案0.98
二、目标
定义对象级的持久化。
完全支持对象模型,包括引用、集合、接口、继承
完全透明持久化:这使得业务对象完全独立于任何数据库技术,这使用了一个字节码增强机制(a byte-code enhancement mechanism)。
缩短开发周期(不再需要映射)
在开发小组中清晰地划分业务人员和数据库人员。
通用持久性
n JDBC限于RDBMS,JDO潜在地可以处理任何类型的数据源,包括RDBMS,ODBMS,TP监控处理,ASCII无格式文件,xml文件,properties文件,大机上的Cobol数据库,等
n JDO是面向大型信息系统的一个完全的解决方案,在这样的系统中,信息存储于多种异质数据源
涵盖J2EE、J2SE、J2ME的广泛实现
强壮的事务模型
同时支持C/S和多层体系结构
三、体系
JDO 包
PersistentCapable:拥有持久实例的类必须实现这个接口。管理对象生命周期。
PersistenceManager :代表了到数据源的连接。一个应用可以打开一个或多个PersistenceManagers。
PersistenceManagerFactory:允许从数据源中得到一个PersistenceManager的实例,这个工厂也可以作为一个连接池。
Transaction:允许界定事务
Query :允许明确地声明性地使用JDO查询语言从数据源中获取数据。NB:也可以通过引用之间的基本的定位,隐含地、透明地从数据源中获取对象。
InstanceCallback:在数据库操作中(比如before/after read, before/after write,等),定义一些钩子,以做特殊处理(像暂时属性的初始化)。
JDOException:JDO操作中抛出的例外。
JDO也定义了帮助类,对象标识(由应用或数据源管理)
JDO实现可以支持或不支持兼容的PersistenceManager(当PersistenceManager是兼容的时,你可以得到存储于不同数据库的对象引用)。
NB:在JDO的第一个发布版本中,并没有严格地定义锁和锁策略。
JDO对象模型
JDO对象模型基本上是Java的对象模型,包括所有的基本类型,引用,集合和事件接口。
除了系统定义类(system-defined classes),支持所有的字段类型(包括简单型、可变和不变的对象类型〔immutable and mutable object types〕、用户定义类、数组、集合、接口)。
支持所有的成员变量修饰符(private, public, protected, static, transient, abstract, final, synchronized, volatile)
除了对象状态依赖于不可访问的或远程对象,即继承于java.net.SocketImpl、本地方法等,所有的用户定义类都可以是PersistentCapable。
JDO对象生命周期
为了能够在数据源中访问、存储对象,应用必须首先得到一个或几个数据源的连接。一个JDO PersistenceManager对象就代表了这样一个连接。它可以通过PersistenceManagerFactory类得到。持久化对象必须是实现了PersistentCapable接口的类的实例。这样的类可能同时拥有持久化的或临时的(transient)实例。
为了使一个实例持久化,编程者必须调用PersistentManager的makePersistent方法。通知JDO对象为持久化或临时的很重要,即使它们可以从JDO的行为中得到它是临时的,比如事务管理和对象标识。对象标识可以由应用管理,或者由数据源代理(这大多是在使用ODBMS实例时,因为概念ObjectID本身就是ODMG模型的一部分)。
JDO支持一种持久化模型,这这种模型中持久性自动传播到引用的对象。这种机制经常称为“延伸持久(persistence by reachability)”或者“传递持久(transitive persistence)”。这意味着一旦一个已经持久化的对象引用了一个临时对象,这个临时对象自动变成持久化的。对于JDBC编程者,这个模型可能很奇怪,但是他们会发现这是大多数情况下编程者希望从持久化框架中得到的支持。
例子:
pmf = (PersistenceManagerFactory) (Class.forName("com.libelis.lido.PersistenceManagerFactory").newInstance()); pmf.setConnectionDriverName("versant"); pmf.setConnectionURL(dbName); pm = pmf.getPersistenceManager(); tx = pm.currentTransaction(); tx.begin(); Provider aProvider = new Provider("LIBeLIS"); pm.makerPersistent(aProvider); // aProvider now persists Address anAddress = new Address("25 rue Paul Barruel", "France", "Paris"); aProvider.address = anAddress ; // anAddress now persists tx.commit(); pm.close();
对象或者通过明确的JDO查询结果从内存中得到,或者通过标准的Java对象之间的导航(navigation)得到。
最后这个机制很强大,你可以把持久对象想像为在JVM堆中的一个特殊的部分,我们称之为“客户端缓存(client cache)”。每次当你企图从一个对象导航到另一个时,如果这个对象尚不在内存中,JDO会自动从数据源中获取,并把它放在缓存中。
例子
假设aProvider对象已经装载到内存,但是它的Address对象还没有。当你写下如下代码时:
System.out.println(aProvider.address.city);
Address对象会自动装载。缓存管理自动链接到事务边界(transaction boundaries),这意味着缓存将在事务结束是刷新,所有的实体都标示为无效的。下次对象访问它们的状态时,自动地、透明地从数据源中再次装载。
例子
pmf = (PersistenceManagerFactory) (Class.forName("com.libelis.lido.PersistenceManagerFactory").newInstance()); pmf.setConnectionDriverName("versant"); pmf.setConnectionURL(dbName); pm = pmf.getPersistenceManager(); tx = pm.currentTransaction(); tx.begin(); Provider aProvider = new Provider("L
[1] [2] 下一篇
