网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java数据对象技术jdo(1)     
  文章作者:未知  文章来源:水木森林  
  查看:98次  录入:管理员--2007-11-16  
 

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

作为异军突起的新型语言,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来访问的底层数据源。

定义数据对象模型

我们将建立一个uml类图,显示一个公司的对象模型的相关类以及相互之间的关系。一个movie(电影)对象表示一部特定的电影。每个至少在一部电影中出演角色的演员由一个actor(演员)对象代表。而role(角色)类表示某个演员在某部电影中扮演的特定角色,因此role类也表示了电影和演员之间的一种关系,这种关系包含一个属性(电影中的角色名)。每部电影包含一到多个角色。每个演员可以在不同的电影中扮演不同的角色,甚至在同一部电影中扮演多个角色。

我们会将这些数据类以及操纵这些数据类实例的的程序放到com.mecdiamania.prototype包中。

需要存储的类



我们定义movie、actor和role这几个类为可持续的,表示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个类分别在哪个包中。

例1-1显示了movie类的源代码。jdo是定义在javax.jdo包中的,注意这个类并不一定要导入任何具体的jdo类。java中的引用和java.util包中的collection及相关子类(接口)被用来表示我们的类之间的关系,这是大多数java应用中的标准方式。

movie类中的属性使用java中的标准类型,如string、date、int等等。你可以将属性声明为private的,不需要对每一属性定义相应的get和set方法。movie类中还有一些用于访问这些私有属性的方法,尽管这些方法在程序中的其它部分会用到,但它们并不是jdo所要求的。你可以使用属性包装来提供仅仅是抽象建模所需要的方法。这个类还有一些静态属性(static的),这些属性并不存储到数据库。 

"genres"属性是一个string型的,内容是该电影所属的电影风格(动作、爱情、诡异等等)。一个set接口用来表示该电影的演员表中的角色集合。"addrole()"方法将元素加入到演员表中,而"getcast()"方法返回一个不可以更改的集合,该集合中包含演员表。这些方法并不是jdo规定的,只是为了方便应用编程而编写的。"parsereleasedate()"方法和"formatreleasedate()"方法用于将电影的发行日期标准化(格式化)。为了保持代码的简单,如果parsereleasedate()的参数格式不对,将会返回null。

 例1-1 movie.java

package com.mediamania.prototype;

import java.util.set;

import java.util.hashset;

import java.util.collections;

import java.util.date;

import java.util.calendar;

import java.text.simpledateformat;

import java.text.parseposition;

public class movie {

private static simpledateformat yearfmt = new simpledateformat("yyyy");

public static final string[] mpaaratings = {

"g", "pg", "pg-13", "r", "nc-17", "nr"};

private string title;

private date releasedate;

private int runningtime;

private string rating;

private string website;

private string genres;

private set cast; // element type: role

private movie() {}

public movie(string title, date release, int duration, string rating,

string genres) {

this.title = title;

releasedate = release;

runningtime = duration;

this.rating = rating;

this.genres = genres;

cast = new hashset();

}

public string gettitle() {

return title;

}

public date getreleasedate() {

return releasedate;

}

public string getrating() {

return rating;

}

public int getrunningtime() {

return runningtime;

}

public void setwebsite(string site) {

website = site;

}

public string getwebsite() {

return website;

}

public string getgenres() {

return genres;

}

public void addrole(role role) {

cast.add(role);

}

public set getcast() {

return collections.unmodifiableset(cast);

}

public static date parsereleasedate(string val) {

date date = null;

try {

date = yearfmt.parse(val);

} catch (java.text.parseexception exc) {}

return date;

}

public string formatreleasedate() {

return yearfmt.format(releasedate);

}

}

jdo对一个需要存储的类强加了一个要求:一个无参数的构造器。如果你在类代码中不定义任何构造器,编译器会自动产生一个无参数的构造器;而如果你定义了带参构造器,你就必须再定义一个无参构造器,可以将其声明为private以禁止外部访问。如果你不定义这个无参构造器,一些jdo产品会自动为你产生一个,但这只是具体的jdo产品提供的功能,是不可移植的。

 
 
上一篇: java语言的局部类    下一篇: java对象序列化(1)
  相关文档
java socket编程(二) 11-17
hibernate 能够满足我们的验证需求 11-17
使用actionforward优化struts应用程序 11-16
jsp中在内存中生成的图片显示到页面中 11-17
整合 macromedia flex和 java 11-17
osworkflow 小培训(2) 11-17
java servlet api说明文档(2.1a版)(四) 11-17
helloword编译方法以及常见错误 11-17
我们在定义常量的时候,可以把常量定义在接口里面,如: 12-27
java 跳转语句 11-17
jsp学习记录(三)——jsp表达式 11-17
awt 将graphics对象转换为image对象 11-17
java桌面应用程序设计:swt简介(1) 11-16
java发展回顾 11-17
java连接sqlserver实例 11-17
ant让你批量运行native2ascii命令 11-17
big 方法 11-16
详细解析 java中的抽象类和接口的区别 11-16
认识p-unit:一款开源的性能测试工具 11-17
jbuilder7与weblogic7整合开发之-环境建立 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息