创建EJB组件

816-7864-10

Table of Contents Table of Contents Next Chapter

第6章


开发BMP型实体Bean

翻译:Smiling_Sundoc:王锦全

前两章讲述了将持久性管理工作代理给EJB容器的实体BeanCMP Bean——译注)。本章将讨论如何创建包含所有自己管理持久性的代码的实体Bean以及如何与之交互,这就是bean管理持久性(bean-managed persistent BMP)的BeanCMP 实体beans BMP 实体beans的开发有许多相似之处;本章则主要关注于其不同之处。

Sun Java System Studio IDE提供向导便于你创建BMP实体Bean所有需要的类:一个bean类、远程(remote)或本地(local)接口或二者兼有、以及可能的一个主键类(primary-key class)。为便于你开始,EJB构建器(EJB Builder)向导会自动执行创建一个BMP实体bean基本结构的任务。

在编写整个实体bean时,你还拥有许多其他未在本章中说明的选项。虽然Sun ONE Studio IDE被设计用来帮你做许多编码工作,但该IDE还灵活地支持那些选项并把决定权留给你。要获得更多信息,参见列在开始之前的相关资源,或者可以参考编写企业bean方面的众多优秀教材中的一本。


决定采用一种方法

你可以采用好几种方法在该IDE中创建实体bean。但是,如果你使用其推荐的方法就会获得最广泛的支持并且能最快地完成bean。这一方法充分利用了IDE的能力来保证一致性并坚持J2EE的标准。

如果你不能肯定你的实体bean是否需要自己管理持久性,看一看。


创建一个 BMP 实体 Bean

EJB构建器向导会自动完成创建你的BMP实体bean缺省类的工作。这些缺省类由该向导生成。但是,该向导不会作出任何你希望你的BMP实体bean如何与数据库交互的假设。因此创建缺省类的初始过程会非常简明。要创建一个BMP实体bean,你可以采用以下步骤:

1.选择或创建一个包用来包含该BMP实体bean

2.EJB构建器向导来生成你的BMP实体bean的基本结构。

3.如果需要,给该bean加一个主键类。

4. 如果需要,给bean的代码中加入创建(create)方法、业务(business)方法、home方法和查找(finder)方法。

5.完成你所添加方法的方法体。

6.编写所有的持久代码。完成所有影响数据库中数据的方法。

这些基本步骤会在下面讨论。

创建一个包

如果你需要创建一个包来保存你的实体bean,选择一个文件系统,单击鼠标右键并选择“New Java Package

启动EJB构建器向导

当你准备要创建一个BMP实体bean时,按一下步骤执行:

BMP实体bean的基础结构

在向导的BMP实体EJB面板中,执行以下步骤:

1.为你的BMP实体bean键入一个名字。

2.决定给你的BMP实体bean一个本地接口还是一个远程接口,还是两者都要。

如果需要,你可以修改该实体bean的包的位置。

3.单击“Next (或者,如果你喜欢可以跳到下一步)

BMP实体bean的类文件面板显示了为你的BMP实体bean生成的类文件。如果需要:

  • 你可以使用“Modify”按钮来修改任一类的名字、指明一个已存在地类或者创建一个新类。例如,你可能正在实现一个其home和远程接口都已经指明的bean,而现在你想创建一个新的bean类。
  • 你可以为任一显示的类单击“Modify”按钮并修改其父类。如果你想这样做,选择一个继承了恰当接口的类。

4.完成后单击“Finish

该向导生成你的BMP实体bean的缺省类。我们随后会讨论这些类。


查看一个 BMP 实体 Bean 的类

EJB构建器向导为一个BMP实体bean生成所有需要的实体bean类并建立起它们间的通讯。但是你必须自己为所有的持久逻辑编码。

在该对象管理器(Explorer)的“Filesystems”面板里,一个BMP实体bean具有和一个CMP实体bean相同的表示,除了当你让鼠标停留在该bean的逻辑结点上时工具提示(tool tip)会说明这是一个BMP实体bean逻辑结点。

展开结点

当你展开你的BMP实体bean包结点下面的结点时,你会看到象图6-1那样的树形视图,在该例中这一bean已经被赋予了本地型接口。 注意,一个BMP实体bean可以没有select方法。

  6-1 一个BMP实体bean的对象管理器详细视图

Screenshot showing the expanded nodes of a BMP entity bean in the Explorer window.

如果你生成了一个主键类,它会作为一个主要结点显示在该对象管理器的上部。

回顾生成的类

EJB构建器向导会给每一个实体bean添加几个缺省的方法。

findByPrimaryKey 方法

方法签名(signaturefindByPrimaryKey是自动加到你的BMP实体beanhome接口上的,如下例所示:

public customer findByPrimaryKey(String aKey) 
        throws RemoteException, FinderException; 

因为这是一个BMP实体bean,向导会给该bean类添加该方法的对应部分ejbFindByPrimaryKey

public String ejbFindByPrimaryKey(String aKey) { 
        return aKey; 
} 

一个BMP 实体Bean的生命期方法(Life-Cycle Methods

该向导会给你的BMP实体bean添加缺省的生命期方法,如代码示例6-1所示。

代码示例 6-1      一个BMP实体Bean的缺省生命期方法

public void setEntityContext(javax.ejb.EntityContext aContext) {
        context=aContext;
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void ejbRemove() {
}
public void unsetEntityContext() {
        context=null;
}
public void ejbLoad() {
}
public void ejbStore() {
}

表6-1说明了一个BMP实体bean中这些方法的目的(作为比较,参看一个CMP实体bean类缺省生命期方法的目的

6-1       一个 BMP 实体bean类缺省生命期方法的目的

方法

目的

setEntityContext

这一方法让你在一个域(field)中保存EntityContext的引用并构造非持久性域。你可以利用它来分配独立于该EJB对象并在整个该实体bean生命期中都会保持的资源,比如一个数据库连接工厂。缺省地,EJB构建器向导会生成代码来把EntityContext赋给一个叫做context的域。

ejbActivate

这一方法初始化该bean、为使用它作准备并获得该实例需要的资源。

ejbPassivate

在该bean实例返回到通用实例池(generic instance pool)中前,该方法释放该bean用到的资源。

ejbRemove

在一个BMP中,该方法执行SQL Delete语句并从后台的数据存储中删除数据。或者,你可以调用其他对象如一个DAO来删除数据。

unsetEntityContext

这一方法让你在容器销毁该实体bean实例前重置资源并释放该实例用到的内存。

ejbLoad

在一个BMP中, 该方法执行SQL Select语句并从后台的数据源中加载数据到该bean实例中。这在该bean被激活或者当该实体在一个新的交易上下文中被引用时发生。或者,你可以调用另一个对象如一个数据访问对象(DAO)来加载数据。

ejbStore

在一个BMP中,这一方法执行SQL Update语句并把bean的状态(持久域中的当前值)保存到后台的数据存储中。这是在该bean 钝化(passivated)时或交易提交时发生的。或者你可以调用另一个对象如一个DAO来保存数据。


完成你的BMP实体Bean

要完成你的BMP实体bean,执行以下步骤:

  • 添加所有的持久逻辑
  • 如果你的BMP实体bean有一个复合主键,添加一个主键类。
  • 如果你希望bean的客户程序能往数据库里插入数据就定义一个创建方法。一个实体bean可以拥有多个创建方法。
  • findByPrimaryKey以外再定义几个你的BMP实体bean用到的查找方法并为这些查找方法编写方法体。
  • 编写ejbRemove方法来从数据库中删除恰当的记录。
  • 定义所有你的BMP实体bean需要的业务和home方法。
  • 添加private域在内存中维护你的实体状态并构造这些域的值。

在处理企业Bean时使用推荐的方法

附录A 探讨了修改你的企业bean的最佳方式,以及当你采用其他方式时可能会遇到的错误和异常。作为一条总的原则,你应该通过逻辑结点而不是单独的类结点来工作,利用bean的属性页(property sheets)或定制对话框(Customizer dialog box)来编辑方法,以及使用IDE的源码编辑器(Source Editor)来完成或编辑所有通过这些对话框访问不到的bean代码。

添加持久逻辑

要使你的BMP实体bean能与实体数据存储交互,你必须编写代码来访问这些数据,操作持久性域,并在你的bean实例变量和数据存储间传输数据。利用源码编辑器编写你的代码。利用资源引用(resource references)(如第8章讨论的那样)来指明你的bean将要用到的数据源。

添加主键类

如果存在下述情况,利用源码编辑器添加一个主键类。

  • 当创建该BMP实体bean时你没有创建一个主键类而你的bean又需要一个。
  • 你需要指明一个主键但其又不能用其他任何既存的类来表示。
  • 你的主键既不是java.lang.String型也不是一个既存的主键类。
  • 你必须定制equalshashCode方法的定义。
  • 你想为主键包装一些其他的功能,如在把它用于数据库前检查键的有效值。

请确保你的主键类满足下列要求:

  • 该类具有public访问控制修饰符。
  • 该类的所有域都被声明为public
  • 该类具有一个public型的缺省构造函数。
  • 该类实现了hashCodeequals方法。
  • 该类是可序列化的:它实现了java.io.Serializable接口。
  • 该类没有实现java.rmi.Remote接口。

更多信息请参见添加或替换一个主键类中的讨论。

添加方法

要开始定义一个新方法,打开对象管理器,右键单击逻辑bean结点使用从上下文关联菜单中可以获得的GUI工具。利用其对话框来命名一个方法并定义它的签名。该IDE会自动把你的方法分派给正确的类。然后利用源码编辑器完成对你的方法的编码。

定义创建方法

你的BMP实体beanhome接口可能有一个创建方法,而如果确实有的话,其bean类就必须有相应的 ejbCreate ejbPostCreate方法。如果你采用上述推荐的过程,该IDE就会保证生成这些方法并将其正确的分派下去。

一个BMP实体bean中的ejbCreate方法典型地做如下工作:

1.检查客户端提供参数的有效性

2.初始化其实例变量

3.执行SQL Insert语句(或者你可以调用其他类如一个DAO来给后台数据存储插入数据)

4.返回一个主键

在一个BMP实体bean中,你必须提供生成和执行必须的SQL Insert语句的代码。

IDE自动添加的ejbPostCreate方法为程序员提供了一个把关于其EJB对象(如home或远程接口)的信息传给其他需要引用它的企业bean的机会。该方法可以通过EntityContext访问其远程接口,而EntityContext是它从容器那里获得的一个参数。这一方法通常是用来创建一个独立的bean。例如,Order beanejbCreateLineItem方法可以在ejbPostCreate方法中创建给定的line items

你的实体bean可以有多个创建方法。按如下步骤定义一个新的创建方法:

1.选择逻辑结点,单击右键并选择“Add Create Method”。

Add New Create Method”对话框显示出来。

2. 通过在“create后面加任意扩展来命名你的创建方法。

现在你需要为你的方法加入参数。

3.在对话框中单击“Add”。

4. 在“Enter Method Parameter”对话框中指明其参数名称和类型。

不论在一个BMP实体bean类中的方法签名还是该方法体中都返回其主键类型。

5.单击“OK” 关闭“ Enter Method Parameter”对话框。

6. 在“Add New Create Method”对话框中指明任何其他的异常。

7. 单击“OK”关闭“Add New Create Method”对话框。

你添加的方法现在在该bean类的代码里显示为ejbCreate而在home接口中显示为createejbPostCreate也显示在bean类里了。

8..利用源码编辑器给你的新创建方法添加返回语句和其他需要的代码。

添加查找方法

EJB构建器已经为你生成了一个缺省的查找方法。在一个BMP实体bean中,该方法显示在home接口(findByPrimaryKey)和bean类(ejbFindByPrimaryKey)中。但是,如果你想让你的实体bean执行其他的查询,你必须定义其他的查找方法。

如果按照下述步骤,你的新查找方法会自动分派给你的home接口和bean类:

1.选择逻辑结点,单击右键并选择“Add Finder Method”。

2. 键入一个以find开始的方法名并指明参数、异常、以及返回值类型。完成后单击“OK”。

用源码编辑器完成你一个或多个查找方法的编码。要从数据源中获得主键,你必须编写JDBC代码或使用其他数据库访问方式。

定义业务和Home方法

要添加一个业务方法给你的BMP实体bean,执行以下步骤:

single-step bullet 在逻辑结点下面选择“Business Methods”,单击右键并选择“Add Business Method”。

 Add New Business Method”对话框显示出来。这时候你可以在该对话框中完成编写方法参数和异常的工作,或者你可以简单地为你的business方法键入一个名字并单击“OK”,然后用源码编辑器来完成代码。

一个业务方法通常会访问并修改持久性域的值,但它不会直接访问数据库。EJB容器会根据交易语义的需要来调用ejbLoadejbStore方法。

或者你可以添加一个home方法来执行一个独立于该实体bean的任何实例的操作。请参看关于home方法的讨论。


创建你的 BMP 实体 Bean 之后

除需要其他几步工作为该bean用于其最终环境作准备外,你的BMP实体bean现在已经完成了。最后这几步在第8章会讨论。

附录A提供了使用已完成的企业bean的建议。


更多的阅读

企业bean可以是你的应用系统中一个非常强大和灵活的部分。创建一个企业bean的基本部分可以很简单,尤其通过利用像Sun Java System Studio IDE这样的工具。但是,完成能满足你应用需求的bean的工作可能会非常复杂。要获得详细信息,请参见企业级JavaBean规范,版本2.0,其位于:
http://java.sun.com/products/ejb/docs.html

创建EJB组件

816-7864-10

Table of Contents Table of Contents Next Chapter

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null