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

全面研读 EJB 2.0

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

  用来描述容器管理的关系的 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 的持久性状态。此外,抽象的持久性方案还为数据建模 --而不是为那些由企业级 bean 表示的业务概念建模 --所以,作为一种设计策略,将抽象的持久性方案对 EJB 客户机隐藏起来是有意义的。

  例如,ContactInfo 关系字段中除了 bean 的客户机所需的简单地址信息之外,还包含许多其它信息。虽然您可以使用抽象持久性方案中的从属对象类 ContactInfo(它对bean 的客户机是隐藏的),但是,您得用其它的对象来把这些数据实际表露给客户机。下面是一个示例,说明了如何对 EJB 客户机隐藏 ContactInfo 从属对象。在此例中,地址信息是通过在 EJB 1.1 的示例中开发的 Address 对象来表露的。


// Employee bean 的远程接口
public interface Employee extends javax.ejb.EJBObject {
   public Address getHomeAddress();
   public void setHomeAddress(Address address);
   public int getIdentity() throws RemoteException;
   public void setFirstName(String firstName) throws
RemoteException;
   public String getFirstName()throws RemoteException;
   public void setLastName(String lastName) throws
RemoteException;
   public String getLastName() throws RemoteException;
}
// Employee bean 的 bean 类
public abstract EmployeeBean implements
javax.ejb.EntityBean {
    ...
    public Address getHomeAddress(){
      ContactInfo info = getContactInfo();
      Address addr = new Address();
      addr.street = info.getStreet();
      addr.city = info.getCity();
      addr.state = info.getState();
      addr.zip = info.getZip();
      return addr;
     }
     public void setHomeAddress(Address addr){
      ContactInfo info = getContactInfo();
            info.setStreet(addr.street);
            info.getCity(addr.city);
            info.getState(addr.state);
            info.getZip(addr.zip);
     }
  ....
  // 容器管理的关系字段
  public abstract void setContactInfo(ContactInfo
info);
  public abstract ContactInfo getContactInfo();
...
}

  尽管容器管理的关系字段没有表露给客户机,但您仍然可以从远程接口直接使用容器管理的持久性字段。请注意,用来访问 firstName 和 lastName 的容器管理的持久性字段是在远程接口中使用的。

  一个 bean 与各种从属对象类之间可能具有多种不同的关系,它们由这种关系的对应性和方向来定义。Bean 与从属对象类之间可以有一对多和一对一的关系。例如,Employee bean 可能仅有一个 Benefit 从属对象类,但可能有许多 ContactInfo从属对象类。


public abstract EmployeeBean implements
javax.ejb.EntityBean {
     ...
      public abstract void setContactInfos(Collection
addresses);
      public abstract Collection getContactInfos():
      public abstract void setBenefit(Benefit benefit);
      public abstract Benefit getBenefit();
     ...
}


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



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

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号