範例:建立 Session Bean Facade

這個主題示範如何利用「建立 Session Bean Facade」精靈來產生 Session Bean Facade。 這個主題也提供了若干利用註釋來變更 Session Bean Facade 的範例。

請參閱 Session Facade 和 SDO 的註釋,以取得 @ws.sdo 和 @ws.sbf 標示組的參照資訊。

在這個實務中,您有一個 EJB 專案包含用來管理拍賣應用程式之資料持續性的 CMP Entity Bean。比方說,您的 CMP Entity Bean 會處理使用者帳戶的登錄、應付帳款的處理,以及銷售出價和項目的管理。 專案包括一個稱為 Registration 的 EJB 2.1 CMP Entity Bean。

Registration CMP Entity Bean 的設計是為了持續保存給定使用者的所有相關資料。 比方說,Registration Bean 包括下列屬性:
  • userid(主鍵)
  • email
  • passwd
  • name
  • cardtype
  • acctnum
  • expiry
  • shippingsame
  • active
  • rank
Registration CMP Entity 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(外來鍵)

您要建立 Session Bean Facade 和 Registration CMP Entity Bean 的 SDO 來管理使用者及其應付帳款。 您可以利用「建立 Session Bean Facade」精靈來快速建立 Facade 和 SDO。

記住: 由於這個範例沒有範例 Bean 程式碼,因此,下列步驟只示範程序和產生的輸出。 您可以利用您自己的 CMP Entity Bean 來嘗試精靈和註釋。
  1. 如果要開啟精靈,請在專案瀏覽器中,用滑鼠右鍵按一下您的 Registration CMP Entity Bean,從蹦現功能表中選取建立 Session Bean Facade。這時會開啟「建立 Session Bean Facade」精靈。
  2. 將這個 Session Bean Facade 命名為 RegistrationFacade,選取 Registration CMP Entity Bean。 「建立 Session Bean Facade」精靈,第 1 頁
  3. 在精靈的下一頁中,指定 SDO 的名稱,確定它不是唯讀。
  4. 選取要併入服務資料物件 (SDO) 的 CMP 屬性和儲存器管理關係 (CMR) 欄位。
    • 對於這個範例中,併入 Registration Bean 所定義的所有屬性。 依預設,會選取包括 userid 主鍵欄位在內的必要屬性。 這個精靈也會選取外來鍵關係(fk_shipaddress : Address)。
    • 之後,選取 [0..*] accountspayable: Accountspayable CMR 關係旁的勾選框:

      「建立 Session Bean Facade」精靈,第 2 頁

      註:
      • 依預設,會選取必要的欄位,如果 SDO 不是唯讀,便必須併入它們。
      • 右側表格目前所選取的 CMR 實體,在左側表格中,會用藍色文字來強調顯示。
  5. 這時請按一下完成,或按下一步來指定 Session Bean Facade 要新增至其中的視覺化圖解。
    • 精靈在 EJB 專案中產生 RegistrationFacadeBean Session Bean。

      專案瀏覽器中的 Session Bean

      除了標準 Enterprise Bean 方法(ejbCreate、ejbActivate、ejbPassivate、ejbRemove、getSessionContext 和 setSessionContext)之外,新的 RegistrationFacade Session Bean 也包括 Registration SDO 的下列方法:
      • applyRegistrationRootChanges
      • createRegistration
      • deleteRegistration
      • getAllRegistrationObjects
      • getRegistrationByKey
      • getRegistrationRoot
      • updateRegistration

      RegistrationFacade Session Bean 包括遠端和本端用戶端視圖,它們是在 EJB 用戶端 JAR 專案中產生的。

    • 在 EJB 用戶端 JAR 專案中產生 SDO Java™ 類別和公用程式 Java 類別。

      專案瀏覽器中的 Session Bean

      • RegistrationRoot.java 檔是根 SDO 介面。其中包括非包含的關係和 Registration Entity 本身的 create() 方法。
      • Address.java、Accountspayable.java 和 Registration.java 是您併入的每個 CMR 關係的 SDO。 每個 SDO 都包括所併入的屬性之 getter 和 setter 方法。
      • SdoClientFactory.java 類別是一個包括 createNewEmptyRegistrationRoot() 方法的 Factory。
    • 由於已選取 Registration CMP Entity Bean 來作為 Facade 的根 Entity Bean,因此,已將註釋新增到 RegistrationBean.java 檔中。 工作台利用註釋來產生適當的 Session Bean 類別和 SDO 類別。依照這個實務所說明來完成精靈作業之後,會新增下列註釋:
      • 在 RegistrationBean.java 檔開頭,會利用 @ws.sbf.session-facade 標示來定義 Facade 的名稱和相關聯的 SDO value-object。 @ws.sdo.value-object 標示用來定義 SDO:
        /**
         * @ws.sbf.session-facade
         * 	name="RegistrationFacade"
         * 	value-objects="Registration"
         * @ws.sdo.value-object
         * 	name="Registration"
         * 	read-only="false"
         * Enterprise Bean 的 Bean 實作類別:Registration
         */
        public abstract class RegistrationBean implements javax.ejb.EntityBean {
      • 在精靈中選取來作為 Session Bean Facade 的一部分之 Registration Entity Bean 的每個 CMP 屬性,在 RegistrationBean.java 檔中,都會新增下列註釋:
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * 取得持續性屬性的存取元:email
        	 */
        	public abstract java.lang.String getEmail();
      • 在精靈中選取來作為 Session Bean Facade 的一部分之 RegistrationBean.java 中所定義的每個儲存器管理關係,在 RegistrationBean.java 檔中,都會新增下列註釋:
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * 	target-value-object="Address"
        	 * 	contained="false"
        	 * 產生這個方法是為了支援名稱為 fk_shipaddress 的關係角色。
        	 * 當刪除/編輯關係時,便會刪除或編輯它。
        	 */
        	public abstract sample.AddressLocal getFk_shipaddress();
    • 由於已在精靈中,將指向 AccountsPayable Entity Bean 的關係新增到 Facade 中,因此,會將下列註釋新增到 AccountsPayable Bean 中:
      /**
       * @ws.sdo.value-object
       * 	name="Accountspayable"
       * 	read-only="false"
       * Enterprise Bean 的 Bean 實作類別:Accountspayable
       */
  6. 編輯 RegistrationBean.java 中的註釋來修改 Session Bean Facade 的名稱。請將 name 參數的值改成 RegistrationFacade1,再將變更儲存起來。
    /**
     * @ws.sbf.session-facade
     * 	name="RegistrationFacade1"
     * 	value-objects="Registration"
     * @ws.sdo.value-object
     * 	name="Registration"
     * 	read-only="false"
     * Enterprise Bean 的 Bean 實作類別:Registration
     */
    儲存好變更之後,工作台會根據變更過的註釋來重新建置新的 RegistrationFacade1 Session Bean:

    專案瀏覽器中的 Session Bean

  7. 利用註釋來將查詢新增至 Session Bean Facade 中。
    1. 在 RegistrationBean.java 檔中,插入新的 @ws.sbf.query 註釋。當您輸入註釋時,您可以按 Alt + / 鍵來使用內容輔助特性。 下列影像顯示建議有效項目的編輯器:

    2. 將查詢命名為 FindRegistrationByEmail。
    3. 利用內容輔助,輸入 [select {$Registration} as r where r.email = ?1] 來作為查詢值。
    4. queries 參數新增至 @ws.sbf.session-facade 標示中,將新查詢新增至 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]"
       * Enterprise Bean 的 Bean 實作類別:Registration
       */
      儲存好變更之後,工作台會根據變更過的註釋,利用新查詢來重新建置 RegistrationFacade1 Session Bean。 現在,RegistrationFacade1 會包括下兩個新方法:
      • applyFindRegistrationByEmailChanges(FindRegistrationByEmail)
      • getFindRegistrationByEmail(Serializable[])
        註: 這個陣列中的引數是根據查詢引數中所定義的索引來編製索引的。
  8. 將新的 RegistrationLite SDO 新增至在 Registration Entity Bean 中包括 email 和 userid 屬性的 Session Bean Facade:
    1. 在 Registration Entity Bean 中,利用 RegistrationLite 這個名稱來定義新的 @ws.sdo.value-object 標示。 RegistrationLite value-object 也需要新增在 @ws.sbf.session-facade 標示的 value-objects 參數中(用空格區隔):
      /**
       * @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]"
       * Enterprise Bean 的 Bean 實作類別:Registration
       */
    2. 更新 userid 和 email 屬性的註釋,以將它們併入新的 RegistrationLite 物件中:
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * 取得持續性屬性的存取元:userid
      	 */
      	public abstract java.lang.Integer getUserid();
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * 取得持續性屬性的存取元:email
      	 */
      	public abstract java.lang.String getEmail();
      由於 RegistrationLite SDO 未定義成唯讀,且 SDO 中只包括 userid 和 email 屬性,因此,編輯器會顯示驗證警告,指出必要的欄位不是 SDO 的一部分。 提供這些警告是因為如果金鑰和必要屬性不在 SDO 中,"create" 便會失敗。
    現在,RegistrationFacade1Bean 包括下列方法:
    • applyRegistrationLiteRootChanges(RegistrationLiteRoot)
    • createRegistrationLite(RegistrationLite)
    • deleteRegistrationLite(RegistrationLite)
    • getAllRegistrationLiteObjects()
    • getRegistrationLiteByKey(RegistrationKey)
    • getRegistrationLiteRoot()
    • updateRegistrationLite(RegistrationLite)
  9. 將 Status Entity Bean 的另一個 SDO 新增至相同 RegistrationFacade1 Session Bean Facade 中:
    1. 在 StatusBean.java 檔中,將下列註釋新增至 Bean 實作中
      /**
       * @ws.sbf.session-facade
       * match="RegistrationFacade1"
       * value-objects="Status"
       * @ws.sdo.value-object
       *   name="Status"
       *   read-only="true"
       * Enterprise Bean 的 Bean 實作類別:Status
       */
    2. 在 RegistrationBean.java 檔中,將 Status value-object 新增至定義給 Session Bean Facade 的清單中:
      * value-objects="Registration RegistrationLite Status"
    由於您將 Status SDO 定義成唯讀,因此,會將下列方法新增至 RegistrationFacade1Bean 類別中(未新增任何 update、create 或 delete 方法):
    • getAllStatusObjects()
    • getStatusByKey(StatusKey)
    • getStatusRoot()
相關概念
Session Bean Facade 和 SDO
相關參考
Session Facade 和 SDO 的註釋
註釋型程式設計概觀
使用條款 | 讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.