级别: 初级 Sheldon Wosnick (swosnick@ca.ibm.com), 顾问软件工程师,WebSphere Studio Application Developer Server Tools Team, IBM 多伦多实验室
2002 年 12 月 01 日 在 WebSphere Studio Application Developer 5.0 中用表和数据源创建程序(Table and Data Source Creator,TDSC)来测试容器管理的持久性(Congtainer Managed Persistence,CMP)EJB
© Copyright International Business Machines Corporation 2002. All rights reserved.
引言
构建访问关系数据库的 J2EE 应用程序对于经验丰富的开发者可能是具有挑战性的,对于初学的开发者尤其如此。无论从属于任何范畴,大多数 J2EE 应用程序都需要某种程度上的 Java 编码持久性,即使应用程序使用的是容器管理的持久性(CMP),这种容器管理的持久性(CMP)把管理持久性层的大量责任授权给应用程序服务器的 EJB 容器。尽管 CMP 的确简化了管理以及数据库相互作用的编码,但是它仍然需要
预先创建并且配置数据库、表和模式,以便执行使用 CMP 的应用程序。通常该数据库设置阶段都很耗费时间并很复杂,而且通常该阶段需要数据库管理专门技术和访问该数据库的特权。
WebSphere Studio Application Developer 5.0 的一个新的功能(实际上是两个新的插件,该新功能非正式地以
表和数据源创建程序著称)简化了测试后端数据库的设置以及测试数据源的创建和配置。当怎样具体实现数据库持久性不是很重要的时候,只用在菜单上单击一下就
自动地操作表和数据源创建程序有助于应用程序的早期测试。在 CMP 开发和测试的早期阶段,表和数据源创建程序处理持久性问题,这使您不需要知道 CMP 是
如何被持久的 ? 使用什么数据库、在哪里创建它、如何维护它、如何访问它等。
本教程将使您一步步的了解如何创建、开发以测试某些简单的 CMP,这些 CMP 是您在执行了一些简单步骤后将在单元测试环境中运行的、用来指定并且用表和数据源创建程序来管理持久性层的。您将不需要了解关于使这些 EJB 持久的数据库的任何特定信息,也不需要以任何方式管理它。被创建的用来在运行时绑定这些表的数据库、表以及数据源是自动被创建的,因此,您可以着重于业务逻辑的测试以及业务逻辑的调试而不需为持久性问题所分心。
我们希望,在 CMP 开发的最初阶段使您免于担心持久性的这种新的方法将使开发并且测试 CMP 不再比开发并且测试会话 bean 更困难。在您已经用 CMP 管理的数据库以及管理的数据源在单元测试服务器上测试并且调试了您的 CMP 以后,您也许需要在实际数据库上或在一个登台服务器上部署并且测试您的 CMP。在这个阶段您将需要指出一些复杂的持久性问题。但是在您的 CMP 代码的初始测试以及调试中,WebSphere Studio 的自动化程度很高的测试环境可以为您处理所有的详细信息,您只要做开发、运行以及测试工作。
您将在本教程中完成什么
该教程向您展示了如何开发并且测试两个简单的 CMP ?
Employee 和
Department 。在 Cloudscape 5.0(一种关系数据库)中,它们是被完全持久化的 ? Cloudscape 5.0 也被称为 DB2j,是一个基于 Java 的、轻量级的嵌入式数据库系统,WebSphere 5.0 中支持它用于测试以及采样。本教程包括下面的开发任务以及测试任务:
请仔细遵循下面的指令,因为每一步都必须被成功地完成,才能创建已经完成的样本。您将创建的两个 EJB 2.0 CMP ?
Employee 和
Department 必须被包含在一个 EJB 2.0 工程中,因为表和数据源创建程序使用只在 EJB 2.0 可得到的功能。工程名称可以是您想用的任何名称 ? 本文使用
MyCompany 。您还可以使用除了下面被使用的值之外的值。所以,如果您准备就绪,请打开您的 WebSphere Studio Application Developer 5.0 EA 的拷贝,让我们开始吧!
1. 创建一个 EJB 2.0 工程
- 通过选择
File => New => Project=> EJB => EJB Project创建一个新的 EJB 2.0 工程。
图 1. 创建一个 EJB 2.0 工程。
- 将 EJB 工程命名为
MyCompany ,对于企业应用程序工程(EAR 模块),接受缺省的名称
DefaultEAR 。接受其余的缺省值并且单击
Finish。
图 2. 提供 EJB 工程名称以及 EAR 模块工程名称。
2. 创建 EJB 2.0 CMP Employee 以及 Department
- 在 J2EE 透视图中创建两个新的 CMP ?
Employee 和
Department :选择
File => New =>Enterprise Bean并且从列表框选择
MyCompany工程。
- 在图 3 中指定若干个值,激活 CMP 2.0 单选按钮并且第一次给定一个 bean 名称
Employee ,第二次给定一个 bean 名称
Department 。单击
Next。
图 3. 创建若干个 CMP。
本教程向您展示了如何创建一个 CMP 2.0 bean 以及属性,因为它是一个最近的 EJB 级别。但是表和数据源创建程序还处理 CMP 1.1 bean,虽然向导页面有些轻微不同,但是如果您想要创建 CMP 1.1 bean,您可以创建它们。
- 针对 CMP 2.0 beans,EJB 规范规定缺省界面是用 CMP 2.0 引入的本地界面(“本地客户机视图”),这有助于减少网络流量以及来自于同一个容器的 EJB 间的调用的其他开销。在使用本地界面之前,唯一的选择就是远程界面,甚至当调用是在单一的容器内的 bean 之间,这还是增加了此种开销。接受各缺省值并且在 CMP 属性部分中单击
Add。
图 4. 本地客户机视图。
- 创建下面的 CMP 属性:
Employee
Field 1: firstName, String,
Field 2: lastName, String
Field 3: empNum, int (key)
Department
Field 1: deptName, String
Field 2: deptNum, int (key)
|
- 在 Create CMP Attribute 对话框中输入这些字段。选中
Promote getter and setter methods to local interface复选框,该复选框为您将签名添加到界面,以此来公开这些方法。为两个 CMP 中的每一个的关键字段选中
Key field复选框。
图 5. 指定 CMP 属性。
3. 为 Cloudscape 生成一个 EJB 到 RDB 的 映射
- 选择
MyCompanyEJB 工程,然后单击右键并且选择
Generate => EJB to RDB Mapping。
图 6. 生成一种映射。
- 指定一种新的自顶向下的映射(一种在您想要从确实存在的 CMP 中创建不存在的数据库表的地方的映射)。向导使用的语言是
创建一种新的后端文件夹。请确信单选按钮已经选中
Top Down(应该是缺省值)。
图 7. 选择自顶向下
- 为后端目标数据库选择
Cloudscape V5.0。虽然您可以为数据库名称以及模式名称提供任何名称,但是我已经指定了
CompanyDB 名称。虽然您必须通过向导来指定一个数据库名称来继续做下去,但是模式名称可以是空白或仅仅是
NULLID (缺省值),这意味着不会创建模式名称或表限定符。虽然您不需要生成 DDL,但是我建议那么做,因为对于调试这有时是有帮助的。
图 8. 使用 Cloudscape 作为目标数据库。
- 现在来自于 J2EE 视图的、已经完成的并且已经被映射的 EJB 结构应该像这样:
图 9. 已经完成的 EJB 模块视图。
- 您也可以选择查看映射的 Enterprise Beans(EJB 视图)表示以及 Tables(RDB 视图)表示来确保它看起来是对的。它应该像这样:
图 10. 映射表示。
4. 生成部署以及 RMIC 代码
- 选择
MyCompanyEJB 工程,然后单击右键并且选择
Generate => Deploy and RMIC Code。
图 11. 生成部署以及 RMIC 代码。
- 选择您应该已经为部署创建的
Employeebean 以及
Departmentbean。如果它们没有被选中,那么单击
Select all => Finish。
图 12. 为 Employee bean 以及 Department bean 生成部署代码。
5. 指定一个将用于查找的 JNDI 名称。
JNDI 名称是一个对 JNDI 中注册的资源的逻辑引用,应用程序在运行时将要用到这些资源。在随后的步骤中将要为您自动地创建的数据源将需要一个 JNDI 名称,通过该名称它可以被引用连接到数据库。所以 JNDI 名称是一种名称服务与用于与后端交互的数据源实例联系的名称。
您可以提供一个缺省的 JNDI 名称(一个对这个 bean 覆盖缺省名称的特定于 bean 的名称),该 JNDI 名称将在一个给定的应用程序模块(EAR)中为所有的 EJB 所使用,或者提供一个两个都使用部署描述符编辑器的混合名称。如果您不提供一个 JNDI 名称,那么不能生成数据源,因为不可能预先知道什么名称应该被绑定于数据源。在创建表和数据源时将会有警告提示您指定一个名称并且再试一次。
- 用于 CMP 2.0 的典型的 J2EE 使用是用来指定一个
单一的缺省JNDI 名称,并且在 WebSphere Studio 中您在第一个选项卡页面(部署描述符编辑器的
Overview选项卡)上这样做。输入“缺省”的 JNDI 名称或在各个 EJB 级别输入一个特定于 EJB 的名称。
- 为了设置一个缺省名称,请为整个 EJB 模块在部署描述符编辑器的第一个
Overview选项卡页面上设置缺省
CMP Factory Connection Binding JNDI 名称为您的指定值。
图 13. 设置一个缺省级绑定。
- 如上所述,如果需要用一个单独的 bean 或若干个 bean 来覆盖缺省值,那么请为特定的 bean 在
Beans选项卡上的
CMP Container Factory JNDI Name字段上设置它。下面是为 Employee bean 提供的一个 JNDI 名称的一个图解:
图 14. 在 EJB 级别上设置 JNDI 名称。
6. 设置当前的后端 ID 为 Cloudscape
如果您已经拥有为 EJB 工程(如果您遵循指令,那么在我们的案例中通常您不会拥有)创建的若干个后端 ID,那么请设置运行时您想要使用的
当前的一个后端 ID。这是因为当前的后端 ID 保持了老的当前的后端 ID,直到您清楚地更改了它。这在运行时很重要,因为服务器需要了解使用哪个后端(如果有多个后端),因为虽然 WebSphere 5.0 在运行时支持多个后端,但是只装入此处所指定的这些持久性符的一个特定的集合。您可以在部署描述符编辑器的
Overview页面上设置这个值。
图 15. 设置当前的后端。
7. 创建一个 WebSphere 5.0 测试环境(测试版)服务器实例
- 创建一个新的服务器工程并且创建一个 WebSphere 5.0(测试版)单元测试服务器以及配置。您可以指定您想要使用的任何名称。
图 16. 创建服务器参考资料。
- 请将 MyCompany 工程(模块)添加到您已经创建的服务器配置。
8. 创建表和数据源
此处是您(最终)得到一个使用新的表和数据源创建程序(该程序应该使您的生活更简单)的机会的地方。
- 从服务器视图中,选择您已经创建的服务器,单击右键,然后选择
Create tables and data sources。
图 17. 自动创建您的表和数据源。
- 确保该工程包含映射 Cloudscape 的 CMP,并且确保您已经按上述的指令执行了该映射。如果您试图在一个不包含 CMP 的 EJB 工程或在一个不包含 Cloudscape 的自顶向下的映射的 EJB 工程上运行表和数据源创建程序,那么您就不能继续该操作。那时您将接收到下面的信息消息。这是一种暗示,暗示您需要通过保证映射已经如预期的被创建了来确保工程限定。
图 18. 操作不可以被执行。
- 如果到现在您已经很好地遵循了指令,那么将已经为您生成了数据库表和数据源。此过程最后的信息消息将确认该状态并且展示在这些不同任务中作用于数据库的不同 SQL 调用的各个状态。如果导出任务已经成功,那么将已经添加
[Successful] 项。如果导出任务失败,它会添加带有该失败描述的
[FAIL] 项。
图 19. 状态消息。
- 如上所述,虽然数据库表
将总是被创建,即使在 EJB 部署描述符中没有指定 JNDI 名称,但是数据源将
不被创建。如果是这种情况,那么一个不同的信息消息将建议您至少为每个 EJB 模块提供一个名称并且再试一次。
图 20. 至少需要设置一个 JNDI 名称。
- 如果您收到了上面的图 20 中的警告消息,或者您已经在 EJB 模块中创建了一个绑定于特定的 JNDI 名称的数据源,那么将不会创建或重新创建这些数据源,因为没有必要这么做。在此过程最后显示的状态消息将通知您该消息。但是,如果您在服务器创建中手动地删除了数据源,那么在这种情况下需要重新创建它。在任何特定的服务器上只允许一个唯一的 JNDI 名称的一个拷贝,用来使在名称服务器上为该服务器实例单独地查找这些数据源。
每次您重新运行
创建表和数据源操作,在执行了一个断开数据库操作以后,将重新创建数据库表。如果有您想要保存在一个特定的数据库中的数据,那么很容易地仅将数据库目录拷贝到某个其他的位置,所以它不会被删除或被覆盖。为测试而生成的表被认为是一种生成的(“测试”)代码形式,所以返回该操作将重新生成那种代码,该代码应该有希望满足典型的使用。
图 21. 在某种条件下不创建数据源或重新创建数据源。
- 所以,如果已经指定了一个 JNDI 名称并且一个给定的 JNDI 的数据源已经不为该服务器实例存在,那么 Cloudscape 的数据源将自动地被创建。在下面的图解中,已经为 Employee bean 提供了一个特定于 bean 的数据源名称。虽然通常您不需要那么做,但是您可以从服务器配置编辑器的
数据源选项卡中查看数据源。
图 22. 数据源的服务器配置页面。
- 虽然将自动地为您创建一个数据源,但是如果您想自己"调整"数据源的设置,那么您当然可以这么“调整”。自动地被创建的设置是为典型的、缺省的案例而设置的。可以使用服务器配置数据源页面来修改它的值。
图 23. 为生成的数据源查看或修改设置。
- 如果您想要使用其他的工具(例如
CloudView)在那儿来查看或操作数据库以及已经创建的表或被持久性的当前的记录(EJB),那么您应该了解工作区中在服务器的临时目录下的文件系统中将要创建的数据库以及表。到数据库的路径(一个在自顶向下的映射中与被输入的数据库名称一样命名的目录)将是:
<WORKSPACE_DIRECTORY>\.plugins\com.ibm.etools.server.core\tmpNN\databases
|
图 24. 数据库表的实际位置。

 |

|
9. 启动服务器并且浏览统一测试客户机(Universal Test Client,UTC)
- 启动服务器并且观察被适当设置的数据源绑定的控制消息以及观察被成功启动的 EJB 应用程序的控制消息。在一些地方的异常或错误建议在您的配置中您可能已经引入了一个错误。
...
[10/6/02 16:53:21:005 EDT] 2f5d0698 ResourceMgrIm I WSVR0049I: Binding CMP unit test environment data source as
CompanyDataSource
[10/6/02 16:53:21:305 EDT] 2f5d0698 ResourceMgrIm I WSVR0049I: Binding CMP unit test environment data source_CF as
eis/CompanyDataSource_CMP
...
[10/6/02 16:53:31:069 EDT] 2f5d0698 ApplicationMg A WSVR0200I: Starting application: DefaultEAR
[10/6/02 16:53:31:089 EDT] 2f5d0698 EJBContainerI I WSVR0207I: Preparing to start EJB jar: MyCompany.jar
[10/6/02 16:53:32:031 EDT] 2f5d0698 EJBContainerI I WSVR0037I: Starting EJB jar: MyCompany.jar
[10/6/02 16:53:34:815 EDT] 2f5d0698 ApplicationMg A WSVR0221I: Application started: DefaultEAR
...
|
- 从 UTC 的主页面,单击
JNDI Explorer来浏览 JNDI 资源浏览器。展开
本地 EJB Bean节点(重新调用,您只被指导去使用本地客户机视图)并且一路探讨下去。您应该看到在 JNDI 名称空间中注册的
Employee EJB 以及
Department EJB。
图 25. 本地 EJB bean 主界面。
- 根据您选择哪个 bean 来测试,在
Employee主页上或
Department主页上单击并且创建该 CMP 的实例。您可以返回浏览一个页面并且还可以装入其他的 bean,这是我已经在下面所做的:
图 26. 准备使用 EJB 引用。

 |

|
10. 用实际的数据库持久性来测试 CMP 方法
CMP 属性的 setter 方法的执行应该导致一个新的记录(EJB)被透明地添加到数据库,您不需要了解它是如何发生的以及它在哪里发生。这是我们以一个非常透明的形式向您提供的测试环境,在此处您可以根据测试它的困难性来把您的 CMP 看作一个简单的会话 bean。
- 选择 setter 方法中的一个并且提供一个合适的值。下面我正在调用传递一个 department 名称
Development 的 Department bean 的
setDeptName() 方法。
图 27. 调用一个 CMP setter 持久性方法。
- 选择匹配的 getter 方法并且执行它。CMP 属性的 getter 方法的执行应该导致从数据库中被访问的添加的(EJB)的新的记录。调用 setter 以及匹配的 getter,并且获取预料的值,这表明 bean 正如设计般运行。
图 28. 调用一个 CMP getter 持久性方法。
11. 导入已经提供的 EAR 模块。
一些人可能发现从已经提供的源工作比执行本教程中所有的步骤要容易。您可以容易地导入 EAR 模块并且获取 CMP 以及用一些简单的步骤运行:
- 下载
NewbieCMP文件并且解压缩
CompanyEAR.ear到一个方便的位置。
- 选择
File => Import => EAR Module来激活企业应用程序导入向导。
- 指定到 EAR 文件的路径并且指定您的选择的(例如
DefaultEAR )一个工程名称。
图 29. 用准备使用代码来导入一个 EAR 模块。
- 接受所有其他的缺省值并且单击
Finish。
- 通过选择
File => Import => Server Configuration来导入服务器配置(下载中可得到的)。然后,例如,输入下面的值:
Configuration Name: MyTestServer
Folder: Server Projects
Configuration Type: WebSphere 5.0 Server Configuration (Beta)
Location: Directory to which you unzipped server configuration to
|
当被提示的时候,如果您想要用同样的
Server Projects 来创建一个新的服务器工程,请单击
Yes。
图 30. 导入设置好的服务器配置。
- 选择
Server Projects工程,单击右键并且选择
New => Server并创建一个叫做
MyTestServer 的服务器,它使用与服务器配置相同的名称(或如果您想要使用的一个不同的名称)。请为上述的第 7 步骤遵循相同的指令。
- 请将服务器配置从
No Configuration转换到
MyTestServer:
图 31. 将服务器配置转换到一个被导入的服务器配置。
- 在开发第 8 步骤入手,创建表和数据源并且通过其余的步骤继续做下去。运行并且测试 CMP。
结束语
本教程已经演示了 WebSphere Studio Application Developer 5.0 中的新的
表和数据源创建程序。它通过在开发的早期阶段使您免于为数据库管理以及配置服务器而费心来使 CMP 开发简化并更有效率。用这种方法,您可以"从数据库里面"快速地并且简单地运行和测试 CMP 而不需要一个外部的数据库系统,这就同您可以用 Application Developer 的早先的版本运行和测试会话 bean 一样简单。这有助于您快速地获取您的 CMP 运行,所以您可以在与该层连接的它们的业务逻辑中发现错误。在开发的早期阶段,它更强调应用程序逻辑而不强调 bean 是如何最终被部署以及被持久在目标系统上的。
下载 | 名字 | 大小 | 下载方法 |
|---|
| NewbieCMP.zip | 0.1 MB | HTTP |
关于作者  | 
|  |
Sheldon Wosnick是 IBM 多伦多实验室的
WebSphere Studio Application DeveloperServer Tools team 中的一名顾问软件工程师。他和他的队员们负责 WebSphere Studio 产品家族的整个服务器运行时环境以及单元测试环境。以前,他是 VisualAge?for Java WebSphere Tools 小组的一名成员。他设计并且集成了 WebSphere 测试环境以及 Apache Tomcat 测试环境,这两个测试环境是 VisualAge for Java 中非常受欢迎的功能,有时候他被人们戏称为“运行时狂人”。他还设计并且实现在该教程中演示的表和数据源创建程序插件。您可以通过
swosnick@ca.ibm.com与他联系。
|
对本文的评价
|