作为异军突起的新型语言,Java定义了一个标准的运行环境,用户定义的类在其中得到执行。这些用户自定义类的实例代表了真实环境中的数据,包括储存在数据库、文件或某些大型事务处理系统中的数据,而小型系统通常也需要一种在本地负责控制数据存储的机制。
由于数据访问技术在不同的数据源类型中是不一样的,因此对数据进行访问成了给程序开发人员的一种挑战,程序员需要对每一种类型的数据源使用特定的编程接口(API),即必须至少知道两种语言来基于这些数据源开发业务应用:Java语言和由数据源所决定的数据访问语言。这种数据访问语言一般根据数据源的不同而不同,这使得学习使用某种数据源的开发成本相应提升。
在Java数据对象技术(JDO)发布之前,通常有三种方式用于存储Java数据:串行化(即Serialization,也称序列化)、JDBC和EJB中的CMP(容控存储)方式。串行化用于将某个对象的状态,以及它所指向的其它对象结构图全部写到一个输出流中(比如文件、网络等等),它保证了被写入的对象之间的关系,这样一来,在另一时刻,这个对象结构图可以完整地重新构造出来。但串行化不支持事务处理、查询或者向不同的用户共享数据。它只允许在最初串行化时的粒度(指访问对象的接口精细程度)基础上进行访问,并且当应用中需要处理多种或多次串行化时很难维护。串行化只适用于最简单的应用,或者在某些无法有效地支持数据库的嵌入式系统中。
JDBC要求你明确地处理数据字段,并且将它们映射到关系数据库的表中。开发人员被迫与两种区别非常大的数据模型、语言和数据访问手段打交道:Java,以及SQL中的关系数据模型。在开发中实现从关系数据模型到Java对象模型的映射是如此的复杂,以致于多数开发人员从不为数据定义对象模型;他们只是简单地编写过程化的Java代码来对底层的关系数据库中的数据表进行操纵。最终结果是:他们根本不能从面向对象的开发中得到任何好处。
EJB组件体系是被设计为支持分布式对象计算的。它也包括对容器管理持续性Container Managed Persistence(参见术语表)的支持来实现持续性。主要由于它们的分布式特性,EJB应用比起JDO来复杂得多,对资源的消耗也大得多。不过,JDO被设计成具有一定的灵活性,这样一来,JDO产品都可以用来在底层实现EJB的存储处理,从而与EJB容器结合起来。如果你的应用需要对象存储,但不需要分布式的特性,你可以使用JDO来代替EJB组件。在EJB环境中最典型的JDO使用方案就是让EJB中的对话组件(Session Bean)直接访问JDO对象,避免使用实体组件(Entity Bean)。EJB组件必须运行在一个受控(Managed,参见术语表)的应用服务环境。但JDO应用可以运行在受控环境中,也可以运行在不受控的独立环境中,这些使你可以灵活地选择最合适的应用运行环境。
如果你将精力集中在设计Java对象模型上,然后用JDO来进行存储你的数据类的实例,你将大大提高生产力和开发效率。你只需要处理一种信息模型。而JDBC则要求你理解关系模型和SQL语言(译者注:JDO并不是要取代JDBC,而是建立在JDBC基础上的一个抽象的中间层,提供更简单的数据存储接口)。即使是在使用EJB CMP(即容控存储,参见术语表)的时候,你也不得不学习与EJB体系相关的许多其它方面的内容,并且在建模方面还有一些JDO中不存在的局限性。
JDO规范了JDO运行环境和你的可存储对象类之间的约定。JDO被设计成支持多种数据源,包括一般情况下考虑不到的数据库之类的数据源。从现在开始,我们使用数据库(参见术语表)这一概念来表示任何你通过JDO来访问的底层数据源。
本章将会展开讨论JDO的基本能力,这些基于对一个虚拟的Media Mania公司所开发的一个小型应用进行细致的分析。这个公司在遍布美国的很多商店中出租和出售多种形式的娱乐音像产品。他们的商店中有一些售货亭,提供一些电影以及电影中的演员的信息。这些信息对客户和商店的职员开放,以帮助选择适合客户口味的商品。
定义数据对象模型
我们将建立一个UML类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个Movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个Actor(演员)对象代表。而Role(角色)类表示某个演员在某部电影中扮演的特定角色,因此Role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。
我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。