EJB Factory 和資料類別

EJB Factory 和資料類別 Access Bean 代表在工作台中找到的新 Access Bean 設計。

這個主題有下列幾個區段:

在適當時,會比較 EJB Factory 和資料類別與採用原始設計的 Java™ Bean Wrapper 和 Copy Helper。

利用 EJB Factory 建立 Enterprise Bean 的實例

為了要說明如可利用 EJB Factory 來建立 Enterprise Bean 的實例,我們假設您有名稱為 MyEJB 的現有 Entity Bean。在建立 MyEJBAccessBean 時,會將預設建構子對映至 findByPrimaryKey(MyEJBKey)。MyEJBKey 有一個 String 欄位,其欄位名稱為 lastName。

在原始 Access Bean 設計中,您可以依下列方式來使用 Access Bean 實例:
   MyEJBAccessBean ab = new MyEJBAccessBean(); // 對映至
          findByPrimaryKey(MyEJBKey);
         ab.setInitKey_lastName = "stokes";
              int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) 在這裡進行
     ...
在新的 Access Bean 設計中,您可以依照完全相同的方式來撰寫程式碼:
   MyEJBFactory factory = new MyEJBFactory();
     MyEJB myEjb = factory.findByPrimaryKey(new MyEJBKey("stokes"));
              int i = myEjb.getAnInt();
     ...
或者,您可以用下列方式撰寫程式碼:
   MyEJBFactory factory = new MyEJBFactory();
          MyEJBKey key = new MyEJBKey("stokes");
          MyEJB myEjb = factory.findByPrimaryKey(key);
              int i = myEjb.getAnInt();
    ...
在原始設計中,如果您要利用不是對映至無引數建構子的 Home 介面方法,您可能會撰寫如下程式碼:
   MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create 在這裡進行
          ab.setAnInt(5);
     ...
在新的設計中,您會撰寫如下的程式碼:
   MyEJBFactory factory = new MyEJBFactory();
          MyEJB myEjb = factory.create("stokes");
          myEjb.setAnInt(5);
     ...
或者,您可以用下列方式來撰寫程式碼:
   MyEJB myEjb = new MyEJBFactory.create("stokes");
          myEjb.setAnInt(5);
     ...
如果在原始設計中,MyAccessBean 使用 create(String) 作為預設的 Home 介面方法,您可以利用這個方式來建構 Access Bean 實例:
   MyEJBAccessBean ab = new MyEJBAccessBean(); // 對映至 create(String);
          ab.setInit_argKey = "stokes";
          int i = ab.getAnInt(); // <- create(String) 在這裡進行
     ...
在新設計之下,您會使用如下程式碼:
   MyEJBFactory factory = new MyEJBFactory();
          MyEJB myEjb = factory.create("stokes");
              int i = myEjb.getAnInt();
     ...

利用 EJB Factory 設定環境定義 Factory 和提供者 URL

假設您需要參照的命名環境定義不是現行「系統」內容設定所參照的命名環境定義。如果您已將無引數的建構子對映至 findByPrimaryKey(),則在原始設計中,您會使用下列程式碼:
   MyEJBAccessBean ab = new MyEJBAccessBean(); // 對映至
      findByPrimaryKey();
      ab.setInit_NameServiceTypeName("com.ibm...CNInitialContextFactory");
      ab.setInit_NameServiceURLName("IIOP://9.21.35.100:900");
        ab.setInitKey_lastName = "stokes";
        int i = ab.getAnInt(); // <- findByPrimaryKey() 在這裡進行
    ...
在新設計中,會以幾乎完全相同的方式來撰寫相同的程式碼:
  MyEJBFactory factory = new MyEJBFactory();
    factory.setInitialContextFactoryName("com.ibm...CNInitialContextFactory");
       factory.setInitialNameServiceProviderURL("IIOP://9.21.35.100:900");
    MyEJB myEjb = factory.findByPrimaryKey(new MyEJBKey("stokes"));
           int i = myEjb.getAnInt();
  ...
不過,如果您要使用不是對映至預設建構子的 Home 介面方法(在這個例子中,是 findByPrimaryKey), 在原始設計中,您將無法使用下列程式碼:
  MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() 在這裡進行
    // 以下兩行沒有影響,因為已經取得 Home
    ab.setInit_NameServiceTypeName("com.ibm...CNInitialContextFactory");
    ab.setInit_NameServiceURLName("IIOP://9.21.35.100:900");
       int i = ab.getAnInt();
  ...
您需要改用下列程式碼:
   // 下面這兩行會呼叫 AbstractAccessBean 類別的靜態 setter
          MyEJBAccessBean.setInit_GlobalNameServiceTypeName("com.ibm...CNInitialContextFactory");
          MyEJBAccessBean.setInit_GlobalNameServiceURLName("IIOP://9.21.35.100:900");
     MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() 在這裡進行
          int i = ab.getAnInt();
     ...

可是,這個程式碼並不具備執行緒安全性。如果執行緒緊接在建構子呼叫之前岔斷,且有另一個執行緒將這些廣域值設成其他值,則 Access Bean 就不會參照您已設定的命名服務。在新設計之下,您會使用如下程式碼:

   MyEJBFactory factory = new MyEJBFactory();
          factory.setInitialContextFactoryName("com.ibm...WsnInitialContextFactory");
          factory.setInitialNameServiceProviderURL("IIOP://9.21.35.100:900");
          MyEJB myEjb = factory.create("stokes");
              int i = myEjb.getAnInt();
     ...

利用資料類別快取作業

如果您利用 Copy Helper Access Bean 來設定若干內容,您可能會使用如下程式碼:
   MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- 對映至
          find(String)
          ab.setAnInt(5);
          ab.setAString("xxx");
     ...
      ab.commitCopyHelper();

在新的設計中,可快取的內容會儲存在另一個物件中;例如,MyEJBData。這時,Copy Helper 的程式碼應撰寫如下:

   MyEJBData data = new MyEJBData();
          data.setAnInt(5);
          data.setAString("xxx");
     ...
     MyEJB myEjb = new MyEJBFactory().find("stokes");
      myEjb.setMyEJBData(data);

如果您利用 Copy Helper Access Bean 來取得若干內容,您可能會撰寫類似下列中的程式碼:

   MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- 對映至
          find(String)
          int i = ab.getAnInt();
          String s = ab.getAString();
     ...

在新設計之下,程式碼會撰寫如下:

   MyEJB myEjb = new MyEJBFactory().find("stokes");
          MyEJBData data = myEjb.getMyEJBData();
          int i = data.getAnInt();
          String s = data.getAString();
     ...

異常狀況處理

在原始設計中,如果您建立了預設建構子對映於 findByPrimaryKey 的 MyEJBAccessBean,用戶端程式碼就應該會類似下列片段:
   MyEJBAccessBean ab = new MyEJBAccessBean(); // 對映至
          findByPrimaryKey(MyEJBKey);
         ab.setInitKey_lastName = "stokes";
          try {
                  int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) 在這裡進行
         ...
          } catch (NamingException nameExc) {
         ...
          } catch (FinderException finderExc) {
         ...
          } catch (CreateException createExc) {
         ...
          } catch (RemoteException remoteExc) {
         ...
          } // endtry

在新設計之下,相同的程式碼會撰寫如下:

   MyEJBFactory factory = new MyEJBFactory();
          try {
                  MyEJB myEjb = factory.findByPrimaryKey(new
          MyEJBKey("stokes"));
                  int i = myEjb.getAnInt();
         ...
          } catch (FinderException finderExc) {
         ...
          } catch (RemoteException remoteExc) {
         ...
          } // endtry
使用條款 | 讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.