示例:创建会话 bean 外观

本主题说明如何使用“创建会话 bean 外观”向导来生成会话 bean 外观。它还提供了使用注释来更改会话 bean 外观的一些示例。

有关 @ws.sdo 和 @ws.sbf 标记集合的参考信息,请参阅会话外观和 SDO 的注释

在此方案中,您具有包括 CMP 实体 bean 的 EJB 项目,用于管理拍卖应用程序的数据的持久性。例如,CMP 实体 bean 会处理用户帐户注册、处理应付帐款以及管理销售中的竞价和项目。项目包括名为“注册”的 EJB 2.1 CMP 实体 bean。

“注册”CMP 实体 bean 旨在维护与给定用户相关的所有数据。例如,注册 bean 包括以下属性:
  • userid(主键)
  • email
  • passwd
  • name
  • cardtype
  • acctnum
  • expiry
  • shippingsame
  • active
  • rank
“注册”CMP 实体 bean 还定义了以下关系:
  • [0..*] accountspayable : Accountspayable
  • [0..*] bid : Bid
  • [0..*] item : Item
  • [0..*] sale : Sale
  • [0..*] sale_1 : Sale
  • [0..*] usertorole: Usertorole
  • [0..1] fk_shipaddress : Address(外键)
  • [0..1] fk_billingaddress : Address(外键)

要为“注册”CMP 实体 bean 创建会话 bean 外观和 SDO 以管理用户及其应付帐款。可以使用“创建会话 Bean 外观”向导快速创建外观和 SDO。

切记: 由于此示例未提供样本 bean 代码,因此,以下步骤仅演示过程及获得的输出。您可以通过自己的 CMP 实体 bean 来体会向导和注释的使用。
  1. 要打开向导,请右键单击“项目资源管理器”中的“注册”CMP 实体 bean,并从弹出菜单中选择创建会话 Bean 外观。此时会打开“创建会话 Bean 外观”向导。
  2. 将会话 bean 外观命名为 RegistrationFacade,然后选择“注册”CMP 实体 bean。创建“会话 Bean 外观”向导,第一页
  3. 在向导的下一页中,命名 SDO 并确保它不是只读。
  4. 选择要在服务数据对象(SDO)中包括的 CMP 属性和容器管理关系(CMR)字段。
    • 在此示例中,包括了在注册 bean 中定义的所有属性。必需的属性(包括 userid 主键字段)在缺省情况下都为选中状态。向导还选择了外键关系(fk_shipaddress : Address)。
    • 然后,选中与 [0..*] accountspayable: Accountspayable CMR 关系相邻的复选框:

      “创建会话 Bean 外观”向导,第二页

      注:
      • 必需的字段在缺省情况下为选中状态,并且,如果 SDO 不为只读,则必须包括这些字段。
      • 当前在右侧表格中选中的 CMR 实体以蓝色文本突出显示在左侧表格中。
  5. 此时,单击完成,或单击下一步以指定要为其添加会话 bean 外观的可视图。
    • 此向导会在 EJB 项目中生成 RegistrationFacadeBean 会话 bean。

      项目资源管理器中的会话 bean

      除了标准企业 bean 方法(ejbCreate、ejbActivate、ejbPassivate、ejbRemove、getSessionContext 和 setSessionContext),新的 RegistrationFacade 会话 bean 还包括“注册”SDO 的下列方法:
      • applyRegistrationRootChanges
      • createRegistration
      • deleteRegistration
      • getAllRegistrationObjects
      • getRegistrationByKey
      • getRegistrationRoot
      • updateRegistration

      RegistrationFacade 会话 bean 包括远程客户机视图和本地客户机视图,它们都在 EJB 客户机 JAR 项目中生成。

    • SDO Java™ 类和实用程序 Java 类会在 EJB 客户机 JAR 项目中生成。

      项目资源管理器中的会话 bean

      • RegistrationRoot.java 文件是根 SDO 接口。它包括非包含关系和“注册”实体本身的 create() 方法。
      • Address.java、Accountspayable.java 和 Registration.java 是每个所包括的 CMR 关系的 SDO。每个 SDO 都包括所包括的属性的 getter 和 setter 方法。
      • SdoClientFactory.java 类是包括 createNewEmptyRegistrationRoot() 方法的工厂。
    • 因为选择 Registration CMP 实体 bean 作为外观的根实体 bean,所以注释会添加至 RegistrationBean.java 文件。工作台使用这些注释以生成适当的会话 bean 类和 SDO 类。通过完成在此方案中描述的向导,添加以下注释:
      • 在 RegistrationBean.java 文件的开头,使用 @ws.sbf.session-facade 标记来定义外观和相关联的 SDO 值对象的名称。@ws.sdo.value-object 标记会定义 SDO:
        /**
         * @ws.sbf.session-facade
         * 	name="RegistrationFacade"
         * 	value-objects="Registration"
         * @ws.sdo.value-object
         * 	name="Registration"
         * 	read-only="false"
         * Bean implementation class for Enterprise Bean: Registration
         */
        public abstract class RegistrationBean implements javax.ejb.EntityBean {
      • 对于在向导中选择并作为会话 bean 外观的一部分的“注册”实体 bean 中的每个 CMP 属性,将以下注释添加至 RegistrationBean.java 文件:
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * Get accessor for persistent attribute: email
        	 */
        	public abstract java.lang.String getEmail();
      • 对于在向导中选择并作为会话 bean 外观一部分的 RegistrationBean.java 文件中定义的每个容器管理的关系,将以下注释添加到 RegistrationBean.java 文件:
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * 	target-value-object="Address"
        	 * 	contained="false"
        	 * This method was generated for supporting the relationship role named fk_shipaddress.
        	 * It will be deleted/edited when the relationship is deleted/edited.
        	 */
        	public abstract sample.AddressLocal getFk_shipaddress();
    • 因为与 AccountsPayable 实体 bean 的关系已添加至向导中的外观,所以将以下注释添加至 AccountsPayable bean:
      /**
       * @ws.sdo.value-object
       * 	name="Accountspayable"
       * 	read-only="false"
       * Bean implementation class for Enterprise Bean: Accountspayable
       */
  6. 编辑 RegistrationBean.java 中的注释以修改会话 bean 外观的名称。将 name 参数的值更改为 RegistrationFacade1,并保存更改。
    /**
     * @ws.sbf.session-facade
     * 	name="RegistrationFacade1"
     * 	value-objects="Registration"
     * @ws.sdo.value-object
     * 	name="Registration"
     * 	read-only="false"
     * Bean implementation class for Enterprise Bean: Registration
     */
    在保存更改之后,工作台会基于更改的注释重建新的 RegistrationFacade1 会话 bean:

    项目资源管理器中的会话 bean

  7. 使用注释以将查询添加至会话 bean 外观。
    1. 在 RegistrationBean.java 文件中,插入新的 @ws.sbf.query 注释。在输入注释时,您可以按 Alt+/ 组合键以使用内容辅助功能。下图显示建议有效条目的编辑器:
      会话 bean 外观注释的内容辅助
    2. 命名查询 FindRegistrationByEmail。
    3. 使用内容辅助功能来输入 [select {$Registration} as r where r.email = 1] 作为查询值。
    4. 通过将 queries 参数添加至 @ws.sbf.session-facade 标记,将新的查询添加至会话外观:
      /**
       * @ws.sbf.session-facade
       * 	name="RegistrationFacade1"
       * 	value-objects="Registration"
       *  queries="FindRegistrationByEmail"
       * @ws.sdo.value-object
       * 	name="Registration"
       * 	read-only="false"
       * @ws.sbf.query
       *   name="FindRegistrationByEmail"
       *   query="[select {$Registration} as r where r.email = 1]"
       * Bean implementation class for Enterprise Bean: Registration
       */
      保存更改之后,工作台会基于由于新增查询而更改的注释重建 RegistrationFacade1 会话 bean。RegistrationFacade1 现在包括下列两种新方法:
      • applyFindRegistrationByEmailChanges(FindRegistrationByEmail)
      • getFindRegistrationByEmail(Serializable[])
        注: 此数组中的自变量根据在查询自变量中定义的索引而建立索引。
  8. 将新的 RegistrationLite SDO 添加至在“注册”实体 bean 中包括电子邮件和用户标识属性的会话 bean 外观:
    1. 在“注册”实体 bean 中,定义名称为 RegistrationLite 的新 @ws.sdo.value-object 标记。还需要将 RegistrationLite 值对象添加(用空格隔开)至 @ws.sbf.session-facade 标记的值对象参数中:
      /**
       * @ws.sbf.session-facade
       * 	name="RegistrationFacade1"
       * 	value-objects="Registration RegistrationLite"
       *  queries="FindRegistrationByEmail"
       * @ws.sdo.value-object
       * 	name="Registration"
       * 	read-only="false"
       * @ws.sdo.value-object
       *  name="RegistrationLite"
       *  read-only="false"
       * @ws.sbf.query
       *   name="FindRegistrationByEmail"
       *   query="[select {$Registration} as r where r.email = 1]"
       * Bean implementation class for Enterprise Bean: Registration
       */
    2. 更新用户标识和电子邮件属性的注释以使其包含在新的 RegistrationLite 对象中:
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * Get accessor for persistent attribute: userid
      	 */
      	public abstract java.lang.Integer getUserid();
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * Get accessor for persistent attribute: email
      	 */
      	public abstract java.lang.String getEmail();
      因为未将 RegistrationLite SDO 定义为只读,而且 SDO 中仅包含用户标识和电子邮件属性,所以编辑器中会显示验证警告,声明必需的字段不是 SDO 的一部分。发出此警告的原因在于,如果键和必需属性不是 SDO 的一部分,“创建”将失败。
    RegistrationFacade1Bean 现在包括下列方法:
    • applyRegistrationLiteRootChanges(RegistrationLiteRoot)
    • createRegistrationLite(RegistrationLite)
    • deleteRegistrationLite(RegistrationLite)
    • getAllRegistrationLiteObjects()
    • getRegistrationLiteByKey(RegistrationKey)
    • getRegistrationLiteRoot()
    • updateRegistrationLite(RegistrationLite)
  9. 将“状态”实体 bean 的其他 SDO 添加至相同的 RegistrationFacade1 会话 bean 外观:
    1. 在 StatusBean.java 文件中,将以下注释添加至 bean 实现
      /**
       * @ws.sbf.session-facade
       * match="RegistrationFacade1"
       * value-objects="Status"
       * @ws.sdo.value-object
       *   name="Status"
       *   read-only="true"
       * Bean implementation class for Enterprise Bean: Status
       */
    2. 在 RegistrationBean.java 文件中,将状态值对象添加至为会话 bean 外观定义的列表中:
      * value-objects="Registration RegistrationLite Status"
    因为将状态 SDO 定义为只读,所以将下列方法添加至 RegistrationFacade1Bean 类(没有添加 update、create 或 delete 方法):
    • getAllStatusObjects()
    • getStatusByKey(StatusKey)
    • getStatusRoot()

反馈