SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

EJB 2.1からEJB 3.0への移行

EJB 3.0における変更点と移行時のポイント

エンティティBeanを移行する

 次に、EJB 2.1のエンティティBeanをEJB 3.0仕様に移行する方法を説明します。EJB 2.1のエンティティBeanは、EntityBeanインターフェイスを実装し、getter CMPフィールドメソッド、setter CMPフィールドメソッド、getter CMRフィールドメソッド、setter CMRフィールドメソッド、コールバックメソッド、およびejbCreate/ejbPostCreateメソッドから成り立ちます。サンプルエンティティBeanである「BookCatalogBean.java」(リスト1)は、CMPフィールドのtitleauthor、およびpublisherと、CMRフィールドのeditionsから成り立ちます。

リスト1 BookCatalogBean.java
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;

public class BookCatalogBean implements EntityBean
{
   private EntityContext ctx;
   public abstract void setTitle();
   public abstract String getTitle();
   public abstract void setAuthor();
   public abstract String getAuthor();
   public abstract void setPublisher();
   public abstract String getPublisher();
   public abstract void setEditions(
      java.util.Collection editions);
   public abstract java.util.Collection getEditions();

   public String ejbCreate(String title)
   {
      setTitle(title);
      return null;
   }

   public void ejbRemove() {}
   public void ejbActivate() {}
   public void ejbPassivate() {}
   public void ejbLoad() {}

   public void ejbStore() {}

   public void setEntityContext(EntityContext ctx)
   {
      this.ctx=ctx;
   }

   public void unsetEntityContext()
   {
      ctx = null;
   }
}

 このEJB 2.1のエンティティBeanの「ejb-jar.xml」配備記述子(リスト2)では、EJBのクラスとインターフェイス、CMPフィールド、EJB QLクエリ、およびCMRリレーションシップを指定します。BookCatalogBeanエンティティBeanでは、finderメソッドのfindByTitle()とCMRフィールドのeditionsを定義します。

リスト2 「ejb-jar.xml」配備記述子
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC
  "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
  "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
  <enterprise-beans>
    <entity>
    <ejb-name>BookCatalog</ejb-name>
    <local-home>BookCatalogLocalHome</local-home>
    <local>BookCatalogLocal</local>
    <ejb-class>BookCatalogBean</ejb-class>
    <persistence-type>Container</persistence-type>
    <prim-key-class>String</prim-key-class>
    <reentrant>False</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>BookCatalog</abstract-schema-name>
      <cmp-field>
          <field-name>title</field-name>
      </cmp-field>
      <cmp-field>
          <field-name>author</field-name>
      </cmp-field>
      <cmp-field>
          <field-name>publisher</field-name>
      </cmp-field>
          <query>
         <query-method>
           <method-name>findByTitle</method-name>
           <method-params>
            <method-param>java.lang.String</method-param>
           </method-params>
         </query-method>
         <ejb-ql>
           <![CDATA[SELECT DISTINCT OBJECT(obj)
             FROM BookCatalog obj WHERE obj.title = ?1 ]]>
         </ejb-ql>
       </query>
      </entity>
  </enterprise-beans>
  <relationships>
    <ejb-relation>
      <ejb-relation-name>BookCatalog-Editions</ejb-relation-name>
      <ejb-relationship-role>
        <ejb-relationship-role-name>
          BookCatalog-Has-Editions
        </ejb-relationship-role-name>
        <multiplicity>One</multiplicity>
        <relationship-role-source>
          <ejb-name>BookCatalog</ejb-name>
        </relationship-role-source>
        <cmr-field>
          <cmr-field-name>editions</cmr-field-name>
            <cmr-field-type>java.util.Collection</cmr-field-type>
        </cmr-field>
      </ejb-relationship-role>
      <ejb-relationship-role>
        <ejb-relationship-role-name>
          Editions-Belong-To-BookCatalog
        </ejb-relationship-role-name>
        <multiplicity>One</multiplicity>
               <cascade-delete />
        <relationship-role-source>
          <ejb-name>Edition</ejb-name>
        </relationship-role-source>
      </ejb-relationship-role>
    </ejb-relation>
  </relationships>
</ejb-jar>

 一方、EJB 2.1のBeanクラスに対応するEJB 3.0のエンティティBeanクラスはPOJOで、かなり簡潔化されています(リスト3)。

リスト3 BookCatalogBean.java
import javax.persistence.Entity;
import javax.persistence.NamedQuery;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.OneToMany;

@Entity
@NamedQuery(name="findByTitle", queryString =
   "SELECT DISTINCT OBJECT(obj) FROM BookCatalog obj WHERE
   obj.title = ?1")

public class BookCatalogBean
{
   public BookCatalogBean(){}
   public BookCatalogBean(String title)
   {
      this.title=title;
   }

   private String title;
   private String author;
   private String publisher;

   @Id
   @Column(name="title", primaryKey="true")

   public String getTitle(){return title;}
   public void setTitle(){this.title=title;}

   public void setAuthor(String author){this.author=author;}
   public String getAuthor(){return author;}

   public void setPublisher(String publisher)
   {
      this.publisher=publisher;
   }
   public String getPublisher(){return publisher;}
   private java.util.Collection<Edition> editions;

   @OneToMany
   public void setEditions(
      java.util.Collection editions)
   {
      this.editions=editions;
   }

   public  java.util.Collection getEditions(){return editions;}

}

 このBeanクラスのEJB 3.0バージョンでは、メタデータアノテーションの@Entityを使います。finderメソッドは、EJB 2.1では配備記述子「ejb-jar.xml」ファイルで要素を使って指定しますが、EJB 3.0では@NamedQueriesアノテーションと@NamedQueryアノテーションを使って指定します。CMRリレーションシップは、EJB 2.1では「ejb-jar.xml」ファイルで要素を使って指定しますが、EJB 3.0ではメタデータアノテーションを使って指定します。主キーフィールドは、アノテーション@Idを使って指定します。表1に、EJB 3.0のよく使われるメタデータアノテーションと、アノテーションの影響を受ける要素(該当する場合)を示します。

表1 EJB 3.0のメタデータアノテーションの一部
アノテーション説明アノテーションの要素
@EntityエンティティBeanクラスのアノテーションを付けます。
@TableエンティティBeanテーブルのアノテーションを付けます。@Tableを指定しないと、既定でテーブル名はEJB名になります。name、schema
@Id主キープロパティまたはフィールドのアノテーションを付けます。
@Transient非永続プロパティまたはフィールドのアノテーションを付けます。
@ColumnエンティティBeanの永続プロパティのマップ列にアノテーションを付けます。name、primaryKey、nullable、length。既定ではプロパティ名またはフィールド名です。
@NamedQueries名前付きクエリのグループにアノテーションを付けます。
@NamedQuery名前付きクエリまたはfinderメソッドに関連付けられたクエリにアノテーションを付けます。name、queryString
@OneToMany1対多の関連付けにアノテーションを付けます。Cascade
@OneToOne1対1の関連付けにアノテーションを付けます。Cascade
@ManyToMany多対多の関連付けにアノテーションを付けます。Cascade
@ManyToOne多対1の関連付けにアノテーションを付けます。Cascade

 EJB 3.0では、EJB 2.1のエンティティBeanクラスのfinderメソッドfindByTitle()に対応するアノテーションとして、@NamedQueryアノテーションを使います。また、EJB 2.1のエンティティBeanのCMRリレーションシップBookCatalog-Editionsに対応するアノテーションとして、EJB 3.0では@OneToManyアノテーションを使います。@Idアノテーションで、IDプロパティtitleにアノテーションを付けます。@Columnアノテーションで、IDプロパティtitleに対応するデータベース列を指定します。@Columnアノテーションを使ってエンティティBeanの永続プロパティにアノテーションが付けられていない場合、EJBサーバーは、列名はエンティティBeanのプロパティ名と同じであると見なします。エンティティBeanの非永続プロパティには、@Transientアノテーションを使ってアノテーションを付けます。

次のページ
EJBエンティティBeanのクライアントを移行する

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Deepak Vohra(Deepak Vohra)

O'Reillyの技術レビュー担当者として『WebLogic: The Definitive Guide』を担当。NuBeanコンサルタント、Web開発者でもある。Sun認定資格(Java 1.4プログラマおよびWebコンポーネントディベロッパJ2EEバージョン)を取得。メールの宛先はdvohra0...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/440 2006/08/22 15:50

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー