全面研读 EJB 2.0(2)

全面研读 EJB 2.0
2001-04-05· --·wsdn

 EJB 1.1 中的 CMP 模型

  在 EJB 1.1 中,bean 开发人员负责将 bean 类的持久性字段声明为 Java 基本类型或可序列化类型。下列示例显示了一个 Employee 企业级 bean 类,它是按 EJB 1.1 定义的,带有几个 CMP 字段:

  // Employee bean 类
  public class EmployeeBean implements
  java.ejb.EntityBean {
  // 实例字段
  EntityContext ejbContext;

  file:// 容器管理的字段
  public int identity;
  public String firstName;
  public String lastName;
  public double salary;
  public Address address;

  public Integer ejbCreate(int id, String fname,String lname){
   identity = id;
   firstName = fname;
   lastName = lname;
   return null;
   }
   ...
  
   // Address 从属类
  public class Address implements Serializable{
  public String street;
  public String city;
  public String state;
  public String zip;
 }

  当将关系数据库用于持久性时,基本字段如 identity、firstName、lastName 和 salary,很容易持久化,因为它们很好地映射为 SQL 类型,如 INTEGER、CHAR 和 DOUBLE。

  在 EJB 1.1 中,CMP bean 的 XML 部署描述符提供 cmp-field 元素,用以标识此 bean 类中的持久性字段(容器管理的字段)。如下所示,cmp-field 元素用来区分写入数据库的字段和不写入数据库的字段。例如,ejbContext 字段就不包括在容器管理的字段的列表中,因此它不是持久性字段。

  <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>

  <cmp-field><field-name>salary</field-name></cmp-field>

  <cmp-field><field-name>address</field-name></cmp-field>

   ...

  容器提供者提供一种工具,用来将 bean 的持久性字段映射到数据库表中的列,通常每个 bean 对应一个表。但是,可序列化的类型,如 Address,就比较难于持久化。在 EJB 1.1 中,没有标准的方法将可序列化的对象映射到关系数据库。虽然 Address 类有其自身的字段集,但 XML 部署描述符并没有提供一种机制,来将这些字段映射到数据库。在大多数情况下,人们期望将可序列化的对象(如 Address)作为二进制类型(有时称为 blob 类型)持久化到某个数据库表中。

  由于实体 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 部署者提供的,从对象到关系的映射信息,为 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 实体的示例,它更具体地说明了抽象持久性方案是如何工作的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的 EJB2 示例: 1. 创建一个接口 MyRemoteInterface,定义一个方法 sayHello: ```java import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface MyRemoteInterface extends EJBObject { public String sayHello() throws RemoteException; } ``` 2. 创建一个实现 MyRemoteInterface 接口的 bean MyBean: ```java import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class MyBean implements SessionBean, MyRemoteInterface { private static final long serialVersionUID = 1L; public void ejbCreate() throws CreateException { } public String sayHello() throws RemoteException { return "Hello World!"; } public void ejbRemove() throws EJBException, RemoteException { } public void ejbActivate() throws EJBException, RemoteException { } public void ejbPassivate() throws EJBException, RemoteException { } public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException { } } ``` 3. 在 ejb-jar.xml 文件中声明 MyBean: ```xml <?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>MyBean</ejb-name> <home>MyRemoteInterface</home> <remote>MyRemoteInterface</remote> <ejb-class>MyBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> ``` 4. 部署到服务器上,可以通过 JNDI 查找 MyBean 并调用 sayHello 方法: ```java import javax.naming.InitialContext; import javax.naming.NamingException; public class MyClient { public static void main(String[] args) throws NamingException, RemoteException { InitialContext ctx = new InitialContext(); MyRemoteInterface myBean = (MyRemoteInterface) ctx.lookup("MyBean/remote"); System.out.println(myBean.sayHello()); } } ``` 以上就是一个简单的 EJB2 示例,它展示了如何创建一个远程 EJB,并在客户端调用它的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangjiamin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值