JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > EJB(CMP Entity Bean)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
EJB(CMP Entity Bean)編
◆EJBとは?
EJBとはEnterprise Java Beansの略です。サーバーサイドのコンポーネント技術の仕様です。EJBにはデーターベースへの接続、トランザクション処理、リモートアクセスなどの機能がすでに実装されているので、開発者はビジネスロジックのみに集中することができ、開発効率を向上することができます。さらに、EJBはコンポーネント技術であるので、一度作ったコンポーネント(部品)の再利用が容易にできるというのも大きな特徴です。
◆CMP Entity Beanとは?
CMP Entity BeanCMPContainer Managed Persistenceの略です。データの永続化をコンテナが行うEntity Beanです。
◆ここでの環境
OS Windows XP
J2SE SDK 1.3.1_01
J2EE SDK 1.3.1
◆Javaの実行環境の構築
アプリケーション編を参考にJavaの実行環境を構築してください。
◆EJBを動かす環境の構築
J2EEのインストールからJ2EEサーバーの起動まではEJB(Stateless Session Bean)編を参考にしてください。
■データベースの起動
ここではJ2EE SDKに付属のCloudscapeというデータベースを使用します。
cloudscape -start
というコマンドで起動できます。
コマンドプロンプト
C:\>cloudscape -start
Thu Mar 07 18:47:49 JST 2002: [RmiJdbc] Starting Cloudscape RmiJdbc Server Version 1.7.2 ...
Thu Mar 07 18:47:52 JST 2002: [RmiJdbc] COM.cloudscape.core.JDBCDriver registered in DriverManager
Thu Mar 07 18:47:52 JST 2002: [RmiJdbc] Binding RmiJdbcServer...
Thu Mar 07 18:47:52 JST 2002: [RmiJdbc] No installation of RMI Security Manager...
Thu Mar 07 18:47:53 JST 2002: [RmiJdbc] RmiJdbcServer bound in rmi registry
 
◆EJB(CMP Entity Bean)編で使用するソース
HelloWorldCMP.java Remoteインターフェイス
HelloWorldCMPHome.java Homeインターフェース
HelloWorldCMPBean.java Beanクラス
HelloWorldCMPClient.java EJBを利用するクライアント
◆EJBの作成
■Remoteインターフェース
HelloWorldCMP.java(ここからダウンロード)
import java.rmi.*;
import javax.ejb.*;

public interface HelloWorldCMP extends EJBObject {
  public String getLanguage() throws RemoteException;
  public void setLanguage(String language) throws RemoteException;
  
  public String getMessage() throws RemoteException;
  public void setMessage(String message) throws RemoteException;
}
■Homeインターフェース
HelloWorldCMPHome.java(ここからダウンロード)
import java.rmi.*;
import javax.ejb.*;

public interface HelloWorldCMPHome extends EJBHome {
  public HelloWorldCMP create(Integer no)  
      throws RemoteException, CreateException;
  
  public HelloWorldCMP findByPrimaryKey(Integer primaryKey) 
      throws RemoteException, FinderException;
}
■Beanクラス
HelloWorldCMPBean.java(ここからダウンロード)
import java.rmi.*;
import javax.ejb.*;

public class HelloWorldCMPBean implements EntityBean {
  EntityContext ctx;
  public Integer no;
  public String language;
  public String message;
  
  public String getLanguage() {
    return language;
  }
  public void setLanguage(String language) {
    this.language = language;
  }
  public String getMessage() {
    return message;
  }
  public void setMessage(String message) {
    this.message = message;
  }
  public Integer ejbCreate(Integer no) 
      throws RemoteException, CreateException, RemoteException {
    this.no = no;
    return null;
  }
  public void ejbPostCreate(Integer no) throws CreateException, RemoteException {
  }
  public void ejbLoad() throws RemoteException {
  }
  public void ejbStore() throws RemoteException {
  }
  public void ejbRemove() throws RemoveException, RemoteException {
  }
  public void ejbActivate() throws RemoteException {
  }
  public void ejbPassivate() throws RemoteException {
  }
  public void setEntityContext(EntityContext ctx) throws RemoteException {
    this.ctx = ctx;
  }
  public void unsetEntityContext() throws RemoteException {
    ctx = null;
  }
}
 
■メソッドの説明
メソッド 説明
setEntityContext() EntityBeanのインスタンス生成後、コンテナによって呼び出され、EntityBeanと、コンテナが保有するコンテキストとの関連付けを行う。
unsetEntityContext() EntityBeanのインスタンスが削除される前にコンテナによって呼び出され、関連するコンテキストの消去を行う。
ejbCreate() クライアントがcreateメソッドを呼び出したときコンテナによって呼び出されます。CMPの場合は引数に与えられるキーをフィールドに代入した後nullを返します。
ejbPostCreate() ejbCreateメソッドが呼び出された後、コンテナによって呼び出されます。ビジネスメソッドが呼び出される前のEntityBeanの初期化をここで行います。
ejbLoad() ビジネスメソッドが実行される前にコンテナによって呼び出され、データベースのデータをEntityBeanのフィールドにLoadするようにインスタンスに指示するためのメソッド。
ejbStore() ビジネスメソッドが終了した後にコンテナによって呼び出され、EntityBeanのフィールドの値をデータベースにStoreするようにインスタンスに指示するためのメソッド。
ejbRemove() クライアントがremoveメソッドを呼び出した場合、EntityBeanが消滅する前にコンテナによって呼びだされます。
ejbActivate() 非活性状態→活性状態になるときに呼び出されます。このメソッドではejbPassvate()メソッドで開放したリソースを取得しなければなりません。
ejbPassivate() 活性状態→非活性状態になるときに呼び出されます。リソースの開放を行います。
(注釈)活性状態と非活性状態について
Entity Beanが活性状態になる場合にはプライマリキーとBeanとの関連付けが行われ、非活性状態になる場合にはプライマリキーとの関連付けが解除されます。
◆コンパイル
コマンドプロンプト
C:\作業フォルダ\JavaHello>javac HelloWorldCMP.java HelloWorldCMPHome.java HelloWorldCMPBean.java

C:\作業フォルダ\JavaHello>
 
◆EJBの設定とデプロイ
EJBを利用可能にするにはdeploy(配置)という作業が必要です。MS-DOSプロンプト(コマンドプロンプト)を開いて deploytool というコマンドで起動できます。
■新規アプリケーションの作成
まず、新規にアプリケーションを作成します。メニューの「File」→「New」→「Application」で作成できます。ここではHelloWorldCMPAppliという名前で作成しました。
■Enterprise Beanの追加
次にEJBを作成します。メニューの「File」→「New」→「Enterprise Bean...」で作成します。作成画面が表示されましたら。まず一回「Next」ボタンで画面をすすめてください。
上のような画面がでましたら、「JAR Display Name」を入力してください。画面に表示されるEJBの名前になります。ここでは「HelloWorldCMP」にしました。次に「Contents」のところの「Edit」ボタンを押してEJBを構成するクラスと追加します。
上でコンパイルした3つのクラスファイルを選んで「Add」ボタンで追加してください。追加できましたら「Next」ボタンで次の画面に進みます。
■EJBのタイプと3つのクラスの選択
まず、EJBのタイプを選びますここでは、Entity Beanを作成するので「Entity」にチェックを入れます。
次に「Enterprise Bean Class」と「Remote Home Interface」と「Remote Interface」を設定します。上で追加した3つのクラスをそれぞれ選んでください。
Enterprise Bean Class → HelloWorldCMPBean
Remote Home Interface → HelloWorldCMPHome
Remote Interface → HelloWorldCMP
■Entity Beanの永続化のタイプの設定
まず、永続化のタイプは「Container managed persistence(1.0)」を選択します。
次に永続化するフィールドにチェックを入れます。ここでは全てチェックしました。
最後にプライマリキーのクラス とプライマリキーのフィールドを選択します。
ここでは、プライマリキーのクラス名を「java.lang.Integer」、プライマリキーのフィールドは「no」を選びました。
これで必要最低限の設定は終わったので「Finish」ボタンを押してウィザードを終了します。
■JNDI名の設定
JNDIとはJava Naming and Directory Interface の略です。名前によってオブジェクトを探すことができるようにする、Java APIです。
上で追加した、HelloWorldCMPの「JNDI Names」のタブを選択してJNDI名を入力します。ここでは「HelloWorldCMP」と入力しました。
■サーバーの追加
サーバーを追加します。メニューの「File」→「Add Server...」で追加してください。ここではローカルマシンでサーバーとクライアントを兼ねるので、「Server Name」には localhost と入力します。J2EEサーバーが動いていれば正常に追加されます。
■Entityのデプロイの設定
デプロイの設定を行います。「Entity」タブの「Deployment Settings...」ボタンを押してください。
下のような窓がでますので「Database Settings...」ボタンを押します。
さらに下のような窓がでますので「Database JNDI Name」に「jdbc/Cloudscape」と入力します。入力しましたらOKボタンを押してください。
最後に「Generate Default SQL...」ボタンを押してください。テーブルや行の作成、削除、検索のSQL文が生成されます。「Create on table on deploy」と「Delete table on undeploy」はチェックを入れたままにしてください。デプロイ時にテーブルが作られ、アンデプロイ時にテーブルが削除されるようにする設定です。
■デプロイ
これで準備が整ったのでデプロイしてみましょう!HelloWorldCMPを選んでメニューの「Tools」→「Deploy...」を選んでください。
画面が表示されましたら、「Return Client Jar」にチェックを入れて「Finish」ボタンを押してください。正常に終了すると、右上のような画面がでてDeployment of HelloWorldEAppli is completeと表示されます。
◆ここで作られるデータベースのテーブルレイアウト
Primary
Key
フィールド名
NO INTEGER
  LANGUAGE VARCHAR(255)
  MESSAGE VARCHAR(255)
 
◆クライアント側プログラム
HelloWorldCMPClient.java(ここからダウンロード)
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.ejb.*;

public class HelloWorldCMPClient {
  public static void main(String[] args) {
    try {
      // ネーミングコンテキストの取得
      Context initial = new InitialContext();
      // JNDI名のルックアップ
      HelloWorldCMPHome home = 
    (HelloWorldCMPHome)PortableRemoteObject.
                         narrow(initial.lookup("HelloWorldCMP"), 
                                HelloWorldCMPHome.class);
      
      HelloWorldCMP hello;
      try {
        // 1行目作成
        hello = home.create(new Integer(1));
        hello.setLanguage("日本語");
        hello.setMessage("こんにちは 世界");
        // 2行目作成
        hello = home.create(new Integer(2));
        hello.setLanguage("英語");
        hello.setMessage("Hello World");
        
      } catch (DuplicateKeyException ex) {
        System.out.println(ex.toString());
      }
      // noが1のものを検索
      hello = home.findByPrimaryKey(new Integer(1));
      System.out.println(hello.getLanguage() + " " + hello.getMessage());
      
      // noが2のものを検索
      hello = home.findByPrimaryKey(new Integer(2));
      System.out.println(hello.getLanguage() + " " + hello.getMessage());
      
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
■コンパイル
コマンドプロンプト
C:\作業フォルダ\JavaHello>javac HelloWorldCMPClient.java

C:\作業フォルダ\JavaHello>

■実行
実行する前に、上で「Return Client Jar」にチェックを入れることにより生成した、HelloWorldCMPAppliClient.jarファイルをクラスパスに追加してください。このファイルにはクライアントのプログラムから呼ばれるスタブが含まれています。
コマンドプロンプト
C:\作業フォルダ\JavaHello>set CLASSPATH=%CLASSPATH%;HelloWorldCMPAppliClient.jar

C:\作業フォルダ\EntityBean>java HelloWorldCMPClient
日本語 こんにちは 世界
英語 Hello World

C:\作業フォルダ\EntityBean>

おおおおおお!!!!表示されましたね!
2度目以降はプライマリキーが重複するため新しいレコード作成時にDuplicateKeyExceptionが発生します。
 
■関連
EJB(セッションビーン)編

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME