EJB Factory 和資料類別 Access Bean 代表在工作台中找到的新 Access Bean 設計。
這個主題有下列幾個區段:
在適當時,會比較 EJB Factory 和資料類別與採用原始設計的 Java™ Bean Wrapper 和 Copy Helper。
為了要說明如可利用 EJB Factory 來建立 Enterprise Bean 的實例,我們假設您有名稱為 MyEJB 的現有 Entity Bean。在建立 MyEJBAccessBean 時,會將預設建構子對映至 findByPrimaryKey(MyEJBKey)。MyEJBKey 有一個 String 欄位,其欄位名稱為 lastName。
MyEJBAccessBean ab = new MyEJBAccessBean(); // 對映至 findByPrimaryKey(MyEJBKey); ab.setInitKey_lastName = "stokes"; int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) 在這裡進行 ...
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(); ...
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); ...
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(); ...
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(); ...
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(); ...
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