开发企业 Bean

您通常将两种企业 Bean 开发方案中的一种与产品配合使用。第一个是在命令行上使用 Ant、Make、Maven 或相似的工具。第二个是基于 IDE 的开发和构建环境。本文中的步骤重点说明在不使用 IDE 的情况下进行开发。

开始之前

仅 Enterprise JavaBeans (EJB) 2.x Bean:设计 J2EE 应用程序及其所需的企业 Bean。
  • 在开发具有容器管理的持久性 (CMP) 的实体 Bean 之前,请阅读“并行控制”主题。
仅 EJB 3.x Bean:设计 Java™ EE 应用程序及其所需的企业 Bean。
  • 在开发具有 CMP 的实体 Bean 之前,请阅读“并行控制”主题。请记住,EJB 3.x 模块不支持实体 Bean。您必须继续将实体 Bean 放在 EJB 2.x 级别的模块中。

关于此任务

选择企业 Bean 开发工具的两种基本方法如下所示:
  • 可使用其中一种可用的 IDE 工具,这些工具可自动生成企业 Bean 代码的重要部分并包含打包和测试企业 Bean 的集成工具。Rational® Application Developer 产品是建议的 IDE。

    install_root/dev/JavaEE/j2ee.jar 添加到 IDE 项目构建路径中,以解决对新的 EJB 3.x API 类的编译依赖性问题。将此 JAR 文件添加到项目构建路径后,代码辅助功能即生效。如果您定义了服务器(请参阅“J2EE 透视图”),请将该服务器指向产品安装目录。在 Rational Application Developer 中创建与 Java EE 相关的项目时,此项目将 install_root/dev/JavaEE/j2ee.jar 自动添加至项目构建路径。

  • 如果您已确定开发没有 IDE 的企业 Bean,您至少需要一个 ASCII 文本编辑器。另外,也可以使用不支持企业 Bean 开发的 Java 开发工具。然后,您可以使用 Java 软件开发包 (SDK) 中提供的工具并在此产品中组装、测试和部署 Bean。

    与组装工具类似,标准的 Java EE 命令行构建环境需要进行一些更改才能使用 EJB 3.x 模块。与先前的 Java EE 应用程序开发模式一样,编译器类路径上 install_root/dev/JavaEE 目录中必须包括 j2ee.jar 文件。在 install_root/samples/src/TechSamp 目录中可找到有关使用 Ant 的命令行构建环境的示例。

下列步骤主要支持第二种方法:没有 IDE 的开发。

过程

  1. 必要时,请将任何现有代码迁移到必需的 EJB 和 JSP 规范版本。

    根据 EJB 规范 V1.1、2.0 和 2.1 编写的应用程序均可在 EJB 3.x 容器中运行,而不必进行更改。请参阅“将企业 Bean 代码迁移到受支持的规范”主题。

  2. 编写和编译企业 Bean 的组件。
    • 用 EJB 3.x 规范开发的会话 Bean 至少需要一个 Bean 类。
    • EJB 1.1 会话 Bean 至少需要一个 Bean 类、一个 Home 接口和一个远程接口。EJB 1.1 实体 Bean 需要一个 Bean 类、一个主键类、一个 Home 接口以及一个远程接口。
    • EJB 2.x 会话 Bean 至少需要一个 Bean 类、一个 Home 或本地 Home 接口和一个远程接口或 Home 接口。EJB 2.x 实体 Bean 需要一个 Bean 类、一个主键类、一个远程 Home 或本地 Home 接口和一个远程或本地接口。接口类型相匹配:如果您实现本地接口,您还必须定义一个本地 Home 接口。
      注意: 主键类可以未知。有关更多信息,请参阅“未知主键类”主题。
    • 消息驱动的 Bean 仅需要一个 Bean 类。
  3. 对于每个实体 Bean,完成工作以处理持久性操作。

    对于 EJB 3.x 模块,请考虑使用 Java Persistence API (JPA) 规范来开发普通旧 Java 对象 (POJO) 持久实体。有关更多信息,请参阅“Java Persistence API”主题。如果您选择根据早期 EJB 规范来开发实体 Bean,请执行下列步骤:

    • 为实体 Bean 持久数据创建数据库模式。
      • 对于具有 CMP 的实体 Bean,必须将 Bean 持久数据存储在其中一个受支持的数据库中。组装工具将自动生成用于为 CMP 实体 Bean 创建数据库表的 SQL 代码。如果 CMP Bean 需要复杂的数据库映射,建议您使用 Rational Application Developer 来生成数据库表的代码。有关使用组装工具的更多信息,请参阅组装工具信息中心。
      • 对于具有 Bean 管理的持久性 (BMP) 的实体 Bean,您可以通过使用数据库工具创建数据库和数据库表,或使用现有的数据库和数据库表。

      有关创建数据库和数据库表的更多信息,请参阅数据库文档。

    • (仅限于 EJB 2.x 的 CMP 实体 Bean)

      使用 EJB 查询语言(EJB QL)定义 Finder 方法查询。

      使用 EJB QL,按如下所示根据 CMP 字段和容器管理的关系定义 Finder 方法:
      • Public Finder 方法在 Bean 的 Home 接口中可视。在 Bean 类中实现,他们仅返回远程接口和集合类型。
      • Private finder 方法,解释为 SELECT 语句,其仅在 Bean 类中使用。他们可以返回本地和远程接口、从属值、其他 CMP 字段类型和集合类型。
    • (仅适用于 EJB 1.1 的 CMP 实体 Bean:IBM® 扩展)为包含专门的 Finder 方法(除 findByPrimaryKey 方法之外)的每个 CMP 实体 Bean 创建 Finder Helper 接口。
      具有 CMP 的实体 Bean 的 Home 接口中包含的每个 Finder 方法都需要除 findByPrimaryKey 方法以外的逻辑:
      • 逻辑必须在名为 NameBeanFinderHelper 的公共接口中定义,其中 Name 是企业 Bean 的名称,例如,AccountBeanFinderHelper。
      • 逻辑必须包含在名为 findMethodName WhereClause 的字符串常量中,其中 findMethodName 是 Finder 方法的名称。字符串常量可以包含零或多个问号 (?),调用 Finder 方法时,这些问号从左到右被此方法的自变量值替换。

示例:使用只读实体 Bean

此使用方案和示例显示了如何编写使用只读实体 Bean 的 Enterprise JavaBeans (EJB) 应用程序。

使用方案

客户有一个包含分类定价和运费信息的数据库,每天在不迟于当地时间晚上 10:00 点钟(按 24 小时计就是晚上 22:00 点钟)对此数据库进行更新。他们想编写对此数据具有只读访问权的 EJB 应用程序。即,此应用程序从不更新定价数据库。通过某个其他应用程序执行更新。

示例

客户的实体 Bean 本地接口可能是:

public interface ItemCatalogData extends EJBLocalObject {
	 
	  public int getItemPrice();
	 
	  public int getShippingCost(int destinationCode);
	 
}

调用此 EntityBean 来计算包括装运在内总成本的无状态 SessionBean 方法(假设它是 TxRequired),其中的代码类似于:

.....
	// Some transactional steps occur prior to this point, such as removing the item from 
  // inventory, etc.
  // Now obtain the price of this item and start to calculate the total cost to the purchaser
 
  ItemCatalogData theItemData = 
	    (ItemCatalogData) ItemCatalogDataHome.findByPrimaryKey(theCatalogNumber);
 
	int totalcost = theItemData.getItemPrice();
	 
	// ...     some other processing, etc. in the interim
	// ...
	// ...
	 
	// Add the shipping costs
	totalcost = totalcost + theItemData.getShippingCost(theDestinationPostalCode);
应用程序汇编期间,客户按如下所示设置此 Bean 的 EJB 高速缓存参数:
  • ActivateAt = ONCE
  • LoadAt = DAILY
  • ReloadInterval = 2200
    不推荐使用的功能部件 不推荐使用的功能部件: 建议不要使用 IBM 部署描述符扩展的 reloadInterval 和 reloadingEnabled 属性,这些扩展包括 WAR 文件扩展 (WEB-INF/ibm-web-ext.xmi) 和应用程序扩展 (META-INF/ibm-application-ext.xmi)。depfeat

每晚 22:00 时之后第一次调用 getItemPrice() 方法时 EJB 容器会从数据库重新装入定价信息。如果在调用 getItemPrice() 和 getShippingCost() 之间时间正好到达 22:00 时,那么 getShippingCost() 方法还是会返回 22:00 时可能已发生的对数据库作出的任何更改之前的值,这是因为此事务中的第一次方法调用发生在 22:00 之前。这样,商品价格和装运成本保持彼此同步地使用。

下一步做什么

组装一个或多个 EJB 模块中的 Bean。请参阅“组装 EJB 模块”主题,或者,如果您正在使用 EJB 3.x Bean,请参阅“组装 EJB 3.x 模块”主题。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvdp
文件名:tejb_dvdp.html