网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  全面研读ejb 2.0(2)     
  文章作者:未知  文章来源:水木森林  
  查看:76次  录入:管理员--2007-11-17  
 
  全面研读ejb 2.0(2)

? ejb 2.0 的 cmp 模型

在 ejb 2.0 中,cmp 实体 bean 和持久性管理器之间的新合约,使您能够在实体 bean 中定义更复杂的、可移植性更强的关系,包括 bean 与 bean 之间、bean 与从属对象之间、甚至从属对象与从属对象之间的关系。

持久性管理器是新加入到 enterprise javabeans 部署过程中的。容器厂商,或专长于特定数据库的持久性的厂商,将能提供这种持久性管理器。其思路是将用于管理 bean 关系的机制从容器中分离出来,容器只负责管理安全、事务和资源。这种职责上的分离使不同的持久性管理器能够与不同的容器一起工作。它也使实体 bean 在不同 ejb 厂商之间以及在各种持久性管理器之间具有更强的可移植性。

如果您使用或学习过 thought inc. 生产的,能自动为 ejb 1.1 容器生成 bmp(bean 管理的持久性)bean 的产品 cocobase,则您对持久性管理器工具如何工作就已经比较熟悉了。cocobase 根据 bean 部署者提供的,从对象到关系的映射信息,为 bmp bean 生成全部数据库访问逻辑。在 ejb 2.0 中,持久性管理器能够根据部署描述符、bean 的抽象持久性方案和部署者完成的工作所提供的信息,生成 cmp 实体到关系数据库的映射。但是,持久性管理器并不局限于关系数据库。也可以为对象数据库以及遗留的系统和 erp 系统(如 sap)开发持久性管理器。

为了将持久性管理器从容器中分离出来,必须定义 bean 与持久性管理器之间的合约。这个合约在新的抽象持久性方案中表现出来。此方案是通过部署描述符中一组新的 xml 元素和 cmp 实体 bean 中的一组代码习语定义的。在 ejb 2.0 中,cmp bean 类被声明为抽象类,它的持久性字段和关系字段是使用抽象的读方法和写方法来访问的,而这两种方法的方法特征则映射为 xml 部署描述符中的特定元素。

在部署该 bean 时,您将使用持久性管理器工具,根据 xml 部署描述符和 bean 类,来具体实现此抽象 bean 类及其从属对象类。具体实现将包括数据访问代码,此代码将在运行时将 bean 的状态实际读出和写到数据库中。在运行时,容器使用由持久性管理器工具生成的子类,而不使用 bean 提供者定义的抽象类。

bean 类的继承层次结构

为了使讨论更充实,这里提供一个 cmp 实体的示例,它更具体地说明了抽象持久性方案是如何工作的。

ejb 2.0 中的一个示例 cmp 实体
在 ejb 2.0 中,容器管理的实体 bean 被定义为抽象的,而且它的持久性字段并不在 bean 类中直接定义。作为替代,开发了一种抽象的持久性方案,从而允许 bean 提供者间接地声明持久性字段和 bean 关系。下面是 employee bean 的一个示例,它使用了新的抽象持久性方案。请注意,该 bean 类中未声明任何持久性字段。

public abstract employeebean implements
javax.ejb.entitybean {
. // 实例字段
entitycontext ejbcontext;
// 容器管理的持久性字段
public abstract void setidentity(int
identity);
public abstract int getidentity();
public abstract void setfirstname(string
firstname);
public abstract string getfirstname();
public abstract void setlastname(string
lastname);
public abstract string getlastname();
// 容器管理的关系字段
public abstract void
setcontactinfo(contactinfo info);
public abstract contactinfo
getcontactinfo();
...
}

在此 bean 的 xml 部署描述符中,抽象的持久性方案声明容器管理的各个字段和各种关系。

<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>employeeejb</ejb-name>
...
<persistence-type>container</persistence-type>
...
<cmp-field><field-name>identity</field-name></cmp-field>
<cmp-field><field-name>firstname</field-name></cmp-field>
<cmp-field><field-name>lastname</field-name></cmp-field>
...
</entity>
</enterprise-beans>
<dependents>
<dependent>
<dependent-class>contactinfo</dependent-class>
<dependent-name>contactinfo</dependent-name>
<cmp-field>street</cmp-field>
<cmp-field>city</cmp-field>
<cmp-field>state</cmp-field>
<cmp-field>zip</cmp-field>
<cmp-field>homephone</cmp-field>
<cmp-field>workphone</cmp-field>
<cmp-field>email</cmp-field>
...
</dependent>
<relationships>
<ejb-relation>
<ejb-relation-name>employee-contactinfo</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>
employee-has-contactinfo
</ejb-relationship-role-name>
<multiplicity>one</multiplicity>
<role-source>
<ejb-name>employeeejb</ejb-name>
</role-source>
<cmr-field>
<cmr-field-name>contactinfo</cmr-field-name>
<cmr-field-type>contactinfo</cmr-field-type>
</cmr-field>
</ejb-relationship-role>
<ejb-relationship-role>
<ejb-relationship-role-name>
contactinfo_belongsto_employee
</ejb-relationship-role-name>
<multiplicity>one</multiplicity>
<role-source>
<dependent-name>contactinfo<dependent-name>
</role-source>
</ejb-relationship-role>
</ejb-relation>
</relationships>
<ejb-jar>

用来描述容器管理的关系的 xml 元素可能变得非常复杂,因为他们必须处理各种关系的对应性和方向(单向的还是双向的)。上面的代码段说明,为了描述 bean 与其从属对象类之间的简单关系,您需要哪些元素。虽然即使是简单的关系也会被转换为冗长的 xml,但所有这些元素都是必需的,以便持久性管理器能够将复杂的对象图映射到数据库中。

虽然用于定义 cmp bean 的抽象持久性方案的 xml 元素是 ejb 2.0 中的 cmp 的主要问题,但为了简洁起见,本文不再提供 xml 示例。作为替代,本文将纯粹依靠 bean 类中必须使用的抽象习语,来说明 ejb 2.0 中的 cmp 背后的基本概念。这些代码习语与 xml 部署描述符中的关系元素一起使用,并由后者定义,所以您不能只有其一而没有另一个,但它们比该方案的 xml 部分较容易理解。

除了 xml 元素之外,抽象的持久性方案还定义了一组习语,它们在声明 bean 类及其相关的对象时必然会用到。用来访问和修改字段的方法是严格定义了的,要求用 set<method> 方法修改持久性字段,而用 get<method> 方法访问它们。这些方法的名称和返回类型由部署描述符中它们相应的 xml 关系元素规定。

实体 bean 类和从属类都遵循相同的抽象持久性方案。下面是如何将 contactinfo 对象定义为从属对象类的示例。

public abstract class contactinfo {
// 家庭地址信息
public abstract void setstreet(string street);
public abstract string getstreet();
public abstract void setstate(string state);
public abstract string getstate();
public abstract void setzip(string zip);
public abstract string getzip();
public abstract void sethomephone(string phone);
public abstract string gethomephone();
// 工作地址信息
public abstract void setworkphone(string phone);
public abstract string getworkphone();
public abstract void setemail(string email);
public abstract string getemail();
...
}

从属对象随实体 bean 的存在而存在,随实体 bean 的中止而中止,这是理解从属对象与实体 bean 之间关系的关键。从属对象包含在一个具体的实体中,所以删除这个实体将导致从属对象也被删除。用关系数据库的术语来说,有时这就称为级联删除。

从属对象,如 contactinfo,用在关系字段中。与实体 bean 形成关系的从属对象技术上称为从属对象类。ejb 客户端应用程序永远不能直接访问从属对象类;这种类不能用作 bean 的远程或本地接口中的参数或返回值。从属对象类只对 bean 类才是可见的。

从属对象类不适合作为远程参数类型,因为它们与 bean 在运行时的持久性逻辑有密切的联系。持久性管理器扩展了抽象的从属对象类,以便能提供一种实现,可用于在运行时管理 bean 的持久性状态。此外,抽象的持久性方案还为数据建模 -- 而不是为那些由企
 
 
上一篇: 全面解析定义方法    下一篇: 全面研读ejb 2.0(3)
  相关文档
探讨 j2se 1.4 发行版中的安全性变化 11-17
最大化j2ee和数据库交互操作的性能 11-16
dwr - direct web remoting 实际使用 11-17
理解ejb的参数传递 11-17
struts开发指南之mvc架构实际应用 11-17
关注性能:异常的异常 11-17
设计心得——用 xdoclet 减少代码膨胀 11-17
专访java之父:java未来的发展 11-17
linux 平台的 jvm 性能评测 11-17
面向对象思想之--理解类和对象 11-17
一个简单的将bmp图片转换成tif 11-17
java布局管理器使用方法探讨 11-16
如何使用aop编程减少升级的风险(图) 11-17
java robot对象实现服务器屏幕远程监视 11-16
如何用java实现web服务器(1) 11-16
readline 方法 11-16
通过继承扩展接口 11-17
使用档案文件提高applet的加载速度 11-16
maven goal ! 11-17
面向对象编程:java复杂数据类型用法 12-10
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息