EJB 팩토리 및 데이터 클래스

EJB 팩토리 및 데이터 클래스 액세스 Bean은 Workbench에 있는 새 액세스 Bean 디자인을 나타냅니다.

이 주제는 다음과 같은 절로 구성되어 있습니다.

해당되는 경우 EJB 팩토리 및 데이터 클래스와 원래의 디자인을 계속 채택하는 Java™ Bean 랩퍼 및 복사 헬퍼를 비교합니다.

EJB 팩토리를 사용한 엔터프라이즈 Bean 인스턴스화

EJB 팩토리를 사용하여 엔터프라이즈 Bean을 인스턴스화하는 방법을 설명하기 위해 기존 엔티티 Bean 즉, MyEJB가 있다고 가정하십시오. MyEJBAccessBean이 작성되면 기본 생성자가 findByPrimaryKey(MyEJBKey)에 맵핑됩니다. MyEJBKey에는 단일 String 필드인 lastName 필드가 있습니다.

원래의 액세스 Bean 디자인에서 다음과 같은 방법으로 액세스 Bean 인스턴스를 사용할 수 있습니다.
   MyEJBAccessBean ab = new MyEJBAccessBean(); // maps to
     findByPrimaryKey(MyEJBKey);
     ab.setInitKey_lastName = "stokes";
     int i = ab.getAnInt(); // <- findByPrimaryKey(MyEJBKey) occurs here
     ...
새 액세스 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();
    ...
원래의 디자인에서 no-arg 생성자에 맵핑되지 않은 다른 홈 인터페이스 메소드를 사용할 경우 다음 코드를 작성할 수 있습니다.
   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);
     ...
MyAccessBean이 create(String)를 기본 홈 인터페이스 메소드로 사용한 경우 원래의 디자인에서 다음과 같은 방법으로 액세스 Bean을 생성할 수 있습니다.
   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();
     ...

EJB 팩토리를 사용하여 컨텍스트 팩토리 및 제공업체 URL 설정

현재 System 특성 설정에 참조되지 않은 다른 이름 지정 컨텍스트를 참조해야 한다고 가정하십시오. no-arg 생성자를 findByPrimaryKey()로 맵핑한 경우 원래의 디자인에서 다음 코드를 사용합니다.
   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();
     ...

데이터 클래스를 사용한 캐시 조작

복사 헬퍼 액세스 Bean을 사용하여 여러 특성을 설정하는 경우 다음 코드를 사용할 수 있습니다.
   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();
     ...

예외 처리

원래의 디자인에서 기본 생성자를 findByPrimaryKey로 맵핑하여 MyEJBAccessBean을 작성한 경우 클라이언트 코드는 다음 단편과 같습니다.
   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

피드백