이 주제는 다음과 같은 절로 구성되어 있습니다.
해당되는 경우 EJB 팩토리 및 데이터 클래스와 원래의 디자인을 계속 채택하는 Java™ Bean 랩퍼 및 복사 헬퍼를 비교합니다.
EJB 팩토리를 사용하여 엔터프라이즈 Bean을 인스턴스화하는 방법을 설명하기 위해 기존 엔티티 Bean 즉, MyEJB가 있다고 가정하십시오. MyEJBAccessBean이 작성되면 기본 생성자가 findByPrimaryKey(MyEJBKey)에 맵핑됩니다. MyEJBKey에는 단일 String 필드인 lastName 필드가 있습니다.
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
findByPrimaryKey(MyEJBKey);
ab.setInitKey_lastName = "stokes";
int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
...
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 occurs here
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(); // maps to create(String);
ab.setInit_argKey = "stokes";
int i = ab.getAnInt(); // <- create(String) occurs here
...
MyEJBFactory factory = new MyEJBFactory();
MyEJB myEjb = factory.create("stokes");
int i = myEjb.getAnInt();
...
MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
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() occurs here
...
새 디자인에서 동일한 코드를 거의 동일한 방법으로
작성할 수 있습니다. 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();
...
그러나 기본 생성자(이 경우 findByPrimaryKey)에 맵핑되지 않은
다른 홈 인터페이스 메소드를 사용한 경우 원래의 디자인에서
다음 코드를 사용할 수 없습니다. MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() occurs here
// The following two lines have no effect, because the home is already acquired
ab.setInit_NameServiceTypeName("com.ibm...CNInitialContextFactory");
ab.setInit_NameServiceURLName("IIOP://9.21.35.100:900");
int i = ab.getAnInt();
...
대신 다음의 코드를 사용해야 합니다.
//The following two lines call static setters on the AbstractAccessBean class
MyEJBAccessBean.setInit_GlobalNameServiceTypeName("com.ibm...CNInitialContextFactory");
MyEJBAccessBean.setInit_GlobalNameServiceURLName("IIOP://9.21.35.100:900");
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- create() occurs here
int i = ab.getAnInt();
...
그러나 이 코드는 스레드 안전 상태가 아닙니다. 스레드가 생성자 호출 직전에 인터럽트되었으며 다른 스레드가 이러한 글로벌 값을 다르게 설정한 경우 액세스 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"); // <- maps to
find(String)
ab.setAnInt(5);
ab.setAString("xxx");
...
ab.commitCopyHelper();
새 디자인에서 캐시 가능한 특성은 별도의 오브젝트(예: MyEJBData)에 저장됩니다. 복사 헬퍼를 위해 작성된 코드는 이제 다음과 같이 작성됩니다.
MyEJBData data = new MyEJBData();
data.setAnInt(5);
data.setAString("xxx");
...
MyEJB myEjb = new MyEJBFactory().find("stokes");
myEjb.setMyEJBData(data);
복사 헬퍼 액세스 Bean을 사용하여 여러 특성을 설정하는 경우 다음과 같이 코드를 작성할 수 있습니다.
MyEJBAccessBean ab = new MyEJBAccessBean("stokes"); // <- maps to
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(); // maps to
findByPrimaryKey(MyEJBKey);
ab.setInitKey_lastName = "stokes";
try {
int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
...
} 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