Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

全面研读 EJB 2.0

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  由于实体 bean 的数据方案逐渐复杂起来,所以这个问题也变得严重了。例如,Employee bean 可能有多个类似于 Address 的子对象,如 Benefits 和JobPosition。这些子对象称为从属对象,可以形成关系数据库中跨几个表的复杂对象图。另外,EJB 1.1中的 CMP 在很大程度上不足以持久化与其它 bean 的关系。在 EJB 1.1 中,如果某个bean 准备维持与另一个 bean 的关系,则容器会自动将主关键字或句柄用作一个链接。与某些其它 bean 的关系其性质可能是双向的,或者要依赖于一些不易用主关键字或句柄来表示的字段,为了保持与这类 bean 的关系,上面的办法已被证明是一种远未完善的机制。

  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 部署者提供的,从对象到关系的映射信息,为 BMPbean 生成全部数据库访问逻辑。在 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>


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Enterprise JavaBeans简介   下一篇:Java 2 EE开发指南(二)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章