持久化Java技术对象到任何关系型数据库都是一项富有挑战性的任务,因为它必须潜心于序列化层次化结构的Java对象到基于表结构的数据库,反之亦然。这个挑战是独一无二的,因为将Java技术对象映射到数据库的列和记录的方式,必须要在速度和效率上同时达到最优化。Java数据对象(JDO)规范,JSR-12,为使用标准的方式来透明地持久化简单Java技术对象和访问数据库定义了API。使用JDO,Java应用程序开发者可以在不使用任何数据库特定代码的情况下编写代码访问底层的数据存储。JDO被设计成在一个企业架构的多重层次中工作,包括Java平台、标准版(Java SE,以前被称为J2SE)、web层和应用服务器。
###adv###本文提供了JDO的指南,它包含了JDO的基本要素,并且提供了使用JDO持久化Java技术对象的示例代码。
持久化,在程序退出后信息可以长期保存,在Java语言中可以使用不同的选择完成。最简单的是文件I/O,但是这种方式不适合在企业级存储中使用(原因很明显)。其它的选择包括以下几种:
·序列化(Serialization):API简单,不支持查询、多用户共享、事务处理和局部数据读取或更新。另外,它不适合大容量数据存储。
·JDBC软件:具有完全访问的SQL数据的功能。JDBC要求开发者必须显式地管理字段值以及把它们映射到关系数据库的表。在这种情况下,开发者必须熟悉另外一种开发语言(例如,查询语言SQL)。
·EJB架构容器管理持久性(CMP):作为Java企业级平台(Java EE,以前被称为J2EE)组件模型的一部分,CMP为EJB容器提供了一种简便的对象持久化服务。然而,它不是一种对于Java平台的普通持久化工具。
一种可行的选择是JDO API,它提供了一种标准的方式,使用Java技术完成对象的持久化,通过结合XML元数据和增强的字节码简化了开发复杂性和降低开发成本。
高级的JDO API为开发者透明地存储数据提供了接口,开发者不必为每一种新的持久化数据存储而学习一种新的数据库访问语言(例如SQL)。JDO也可以使用低级的API(例如JDBC)来存储数据。它使开发者可以编写Java代码透明地访问底层的数据存储,而不需要使用数据库特定代码。JDO在JCP的项目中作为一个JSR开发:JDO1.0,从2002年开始存在,是JSR-12;JDO2.0,2005年初被核准并且正在开发中,是JSR-243。
JDO2.0是一个适合于简单Java对象(POJOs)持久化特点的JSR规范,很多厂家都在提供竞争性的实现。另外,很多厂家很可能在同一个的产品中实现JDO2.0和EJB3.0。这就允许你同时使用两种API,为你提供了逐渐迁移到EJB3.0 POJO的简单方法,将会变为持久化模型的选择。
JDO架构(如图1所示)的两个主要目的就是,为Java应用程序开发者提供透明地以Java技术为核心的访问持久化信息的方式,使数据存储的可插入式实现集成到应用服务器中。
请注意,JDO没有定义数据存储的类型:你可以使用同样的代码持久化的你的Java对象到关系型数据库、对象型数据库、XML和任何数据存储。
·简便性(Portability):使用JDO API编写的程序可以在不同开发商的多种可用的实现上运行,不用修改一行代码,甚至不用重新编译。
·透明地访问数据库(Transparent database access):应用程序开发者编写代码透明地访问底层数据存储,而不需要使用任何数据库特定代码。
·易用性(Ease of use):JDO API允许开发者只需要关注他们自己范围内的数据模型(Domain Object Model,DOM),而持久化的细节就留给JDO实现。
·高性能(High Performance):Java应用程序开发者不需要担心数据访问的性能优化,因为这个任务已经委派给了JDO实现,它通过改善数据访问的模式以获得最佳性能。
·和EJB集成(Integration with EJB):应用程序可以利用EJB的特征,例如远程信息处理、自动分布式事务协调和贯穿整个企业级应用使用同样的DOMs实现安全性。
JDO并不意味着要取代JDBC。它们是两种以各自独一无二的能力互相补充的技术,具有不同技术背景和开发目的开发者可以使用二者中的一个。例如。JDBC通过直接的数据库访问控制和缓存管理,提供给开发者更大的弹性。JDBC是一种在工业界被广泛认可的成熟技术。另一方面,JDO,通过隐藏SQL提供给开发者更大的简便性。它将Java平台开发者从必须熟悉或学习SQL中出来,而将精力集中在DOM上,同时JDO管理在持久存储中对象存储的字段到字段的细节。
JDO被设计成EJB的补充。CMP为容器提供简便的持久化,而JDO可以以两种方式集成到EJB中:(1)通过会话Bean,它含有JDO Persistence-capable类(会话Bean的持久化助手类)用来实现依赖对象;(2)通过实体Bean,它含有被用作BMP和CMP代理的JDO Persistence-capable类。
JDO和EJB之间在持久化模型上显著的差别曾经在开发者中间引起了混乱。作为回应,Sun微系统正领导一个社区项目为Java技术社区创建POJO持久化模型。这个项目在JSR-220的赞助下执行,由Linda DeMichiel领导。JDO2.0(JSR-243)的专家组被邀请加入到EJB3.0(JSR-220)专家组中。
JSR-243(JDO2.0)遵循了那些来自于JSRs220和243规范的领导写给Java技术社区的信件所描述的轮廓。
JDO2.0并不打算作为EJB3.0持久化特定API的集中,而是作为JDO1.0.2的发展。但是JDO的POJO持久化模型和EJB3.0之间的类似处,使得JDO的客户当使用JDO2.0满足立即的需求时,可以很容易的接受EJB3.0持久化模型。另外,JSR-243打算将JDOQL用作一种关于EJB3.0持久化数据的可选查询语言。这种语言了已经被更新从而可以更好地对EJB3.0使用。
·Persistence-capable:这种类型代表那些实例可以被持久化到一个数据存储中的类。请注意,这些类在JDO中被使用之前,需要通过JDO元数据规范进行加强。
金莎与林俊杰