エンティティ Bean の必要条件は、セッション Bean の場合とかなり異なるため、このセクションでは各タイプについて別々に説明します。各セクションには詳細な説明が含まれています。
エンティティ Bean は、サーバーのシャットダウン中に存続させるオブジェクトを表します。パーシスタンスには、次の 2 つのタイプがあります。
エンティティ Bean のインスタンスを表現するデータは通常、リレーショナル データベースのテーブルの行に格納されています。このデータベースには、JDBC データ ストアからアクセスします。これらのテーブルは、複数のデータベースにまたがる場合もあります。
エンティティ Bean に関する一般的な必要条件は次のとおりです。
javax.ejb.EntityBean
を実装する必要があります。
また、実装が必要な定義済みシグネチャを使用する特殊なメソッドもあります。
次の import ステートメントは、エンティティ Bean クラス実装に必ず含めます。
import java.rmi.*;
import javax.ejb.*;
次のステートメントは、クラスがパブリック タイプで、EntityBean
インターフェイスを実装するという必要条件を示しています。
public class BalanceBean implements EntityBean
エンティティ Bean のインスタンスは、関連するコンテキストを格納して、サーバー環境にアクセスできるようにする必要があります。ただし、このフィールドにパーシスタンスは与えません。
protected EntityContext _context;
setEntityContext
メソッドは、必ず定義する必要があります。このメソッドは、Bean インスタンスが作成された後でコンテナによって呼び出され、関連するエンティティ コンテキストを設定します。
public void setEntityContext(final EntityContext context) {
_context = context; }
unsetEntityContext
メソッドも定義する必要があります。このメソッドは、Bean インスタンスが削除される前にコンテナによって呼び出され、関連するエンティティ コンテキストを消去します。
public void unsetEntityContext() {
_context = null; }
エンティティ Bean はゼロまたはそれ以上の ejbCreate
メソッドを持つことができ、それぞれのメソッドは、ホーム インターフェイスで定義された create
メソッドに対応している必要があります。メソッドはパブリック タイプで、ホーム インターフェイスの create
メソッドと同じ引数を使用し、プライマリ キー タイプを返す必要があります。BMP を使用するエンティティ Bean については通常、渡されるキーに対する行があるかチェックし、その行がある場合は DuplicateKeyException を返し、その行がない場合は作成するようなロジックをコーディングします。
ejbPostCreate
メソッドは、エンティティ Bean のホーム インターフェイスに create
メソッドが含まれる場合にのみ必要となります。メソッドはパブリック タイプで、ejbCreate
メソッドと同じ引数を使用し、戻り値は void
タイプです。ビジネス メソッドが呼び出される前に、ejbPostCreate
メソッドを使用して、Bean インスタンスを初期化します。
エンティティ Bean 実装には、ejbFindByPrimaryKey
メソッドも含まれている必要があります。このメソッドは、パブリック タイプでなければならず、必ずプライマリ キー タイプを返します。この Bean 実装には、ejbFindAllAccounts
のような finder メソッドを追加して含めることができます。
エンティティ Bean は、EntityBean
インターフェイスから次のメソッドも実装する必要があります。
ejbRemove
は、データベースからエンティティを削除するために使用します。
ejbActivate
は、Bean インスタンスがオブジェクトに割り当てられる (アクティブになる) ときにコンテナによって呼び出され、Bean インスタンスが準備状態のときに必要な追加リソースを取得できるようになります。ejbLoad
がまだ呼び出されていないため、このメソッドにビジネス ロジックが作成されることはありません。ejbPassivate
は、インスタンスがプールに返される直前にコンテナによって呼び出され、Bean インスタンスは、Bean がインスタンス プール内に存在する間に保持されないリソースを解放できるようになります。ejbLoad
はコンテナによって呼び出され、基礎となるデータベースからインスタンスの状態をロードすることで、状態を同期化するようにインスタンスに指示します。コンテナは、ビジネス メソッドを呼び出す直前に ejbLoad
メソッドを呼び出します。ejbStore
はコンテナによって呼び出され、インスタンスの状態を基礎データベースに格納することで、状態を同期化するようにインスタンスに指示します。コンテナは、ビジネス メソッドを呼び出した直後に ejbStore
メソッドを呼び出します。これらのメソッドに使用するコードは、CMP と BMP では異なります。詳細については、Chapter 28, "Bean 管理パーシスタンス"およびChapter 29, "コンテナ管理パーシスタンス"を参照してください。
Bean のリモート インターフェイスで定義されるメソッドの場合、Bean 実装内にシグネチャが一致するメソッドが存在する必要があります。通常、これらのメソッドはビジネス ロジックを実装します。次の例は、save
メソッドの実装を示します。
public void save(final int value) {
_value += value; }
セッション Bean は通常、ビジネス オブジェクトではなくビジネス ロジックを表します。セッション Bean はデータベースの読み取りと書き込みが可能ですが、Bean インスタンス自体は、サーバーのシャットダウン後に保持されません。セッション Bean メソッドの代表的な使用法に、1 つまたは複数のエンティティ Bean メソッドの呼び出しをラップすることがあります。これらの連携がトランザクションを形成します。
セッション Bean には、次の 2 つのタイプがあります。
すべてのセッション Bean には、 javax.ejb.SessionBean
インターフェイスの実装が必要です。
import java.rmi.*;
import javax.ejb.*;
次のステートメントは、クラスがパブリック タイプで、SessionBean
インターフェイスを実装する必要条件を示しています。
public class LoginSessionBean implements SessionBean
Bean インスタンスは、関連するコンテキストを格納して、サーバー環境にアクセスできるようにする必要があります。
protected SessionContext _context;
setSessionContext
メソッドは、必ず定義する必要があります。このメソッドは、Bean インスタンスが作成され後にコンテナによって呼び出され、関連するセッション コンテキストを設定します。
public void setSessionContext(final SessionContext context) {
_context = context; }
ejbCreate
メソッドは、ホーム インターフェイスに create
メソッドが含まれる場合にのみ必要となります。このメソッドはパブリック タイプで、void タイプの値を返す必要があります。ステートレス セッション Bean の場合、ejbCreate
メソッドに引数を使用することはできません。ステートフル セッション Bean にゼロまたはそれ以上の引数を持つ ejbCreate
メソッドがいくつか含まれている場合があります。
セッション Bean は、SessionBean
インターフェイスから次のメソッドも実装する必要があります。
ejbRemove
は、Bean を削除する直前にコンテナによって呼び出されます。
ejbActivate
は、Bean インスタンスがオブジェクトに割り当てられるときに、コンテナによって呼び出されます。ejbPassivate
は、インスタンスがプールに返される直前に、コンテナによって呼び出されます。