Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド 10g(10.1.3.1.0) B31852-03 |
|
Java Enterprise Edition(Java EE)Enterprise JavaBeans(EJB)は、エンタープライズ規模のオブジェクト指向分散アプリケーションの開発およびデプロイに使用するコンポーネント・アーキテクチャです。EJBアーキテクチャに従って作成されたアプリケーションは、拡張性が高くトランザクション対応で安全です。作成されるコンポーネント・タイプは、一般にEnterprise JavaBeansと呼ばれます。
この章の内容は次のとおりです。
EJBアーキテクチャには、表1-1にリストするオブジェクトを実装するための十分な柔軟性があります。
タイプ | 説明 | 参照先 |
---|---|---|
セッション |
クライアントの操作を実行するために使用される単一のクライアント/サーバー・セッションの継続時間中、クライアントによって作成されるEJB 3.0またはEJB 2.1コンポーネント。 |
|
ステートレス |
対話状態を維持しないセッションBean。特定のクライアントに接続していない再利用可能なビジネス・サービスに使用されます。 |
|
ステートフル |
対話状態を維持するセッションBean。インスタンス変数の値やトランザクション状態などの状態を(存続期間中)維持する単一クライアントとの対話型セッションに使用されます。 |
|
エンティティ |
永続性ユニットで指定されたJava永続性API(JPA)永続性プロバイダを使用してリレーショナル・データベースに格納されている永続データを表すEJB 3.0準拠の軽量エンティティ・オブジェクト(「persistence.xmlファイルとは」を参照)。 |
|
エンティティBean |
リレーショナル・データベースに格納されている永続データを表すEJB 2.1 Enterprise Beanコンポーネント。 |
|
CMP |
コンテナ管理の永続性(CMP)を備えたエンティティBeanは、そのBeanをホスティングしているコンテナで使用される永続性マネージャに永続性管理を委任するエンティティBeanです。 |
|
BMP |
Bean管理の永続性(BMP)を備えたエンティティBeanは、自身の永続性を管理するエンティティBeanです。 |
|
MDB |
メッセージドリブンBean(MDB)は、Java Message Service(JMS)メッセージの非同期コンシューマとして機能するEJB 3.0またはEJB 2.1コンポーネントです。 |
詳細は、次を参照してください。
EJB 3.0を使用している場合、EJB実装のインタフェースはEJBのタイプによって制限されません。たとえば、JPAエンティティの実装では、Plain Old Java Object(POJO)および任意のPlain Old Java Interface(POJI)を使用してEJBを実装できます。javax.ejb.EntityBean
のようなインタフェースを実装する必要はなく、EJBHome
、EJBLocalHome
、EJBObject
またはEJBLocalObject
を拡張する別のインタフェースも不要です。クライアントは、EJB 3.0 POJOエンティティ・インスタンスをnew
で(または「JPAエンティティの問合せ方法」に説明されているEntityManager
で)インスタンス化します。クライアントは、依存性注入またはJNDIルックアップを使用してEJB 3.0セッションBeanをインスタンス化します。詳細は、「EJB 3.0サポート」を参照してください。
表1-2に、EJB 3.0 Enterprise Beanの開発時に作成する構成要素をリストします。
構成要素 | タイプ | 説明 |
---|---|---|
ホーム・インタフェース |
POJI |
|
コンポーネント・インタフェース |
POJI |
|
Beanの実装 |
POJO |
コンポーネント・インタフェースをオプションで実装でき、オプションのホーム・インタフェースおよびコンポーネント・インタフェース(ビジネス・メソッド)で定義されたメソッドを実装するJavaコードを含む必須のPOJOです。必要に応じて、コンテナ・ライフ・サイクル・コールバック関数として機能するよう任意のメソッドにアノテーションを付けることができます。 |
デプロイメント・ディスクリプタ |
|
デプロイのためにBeanの属性を指定するオプションの手段。これらにより、環境、インタフェース名、トランザクションのサポート、EJBのタイプ、および永続性情報など、構成の詳細を決定します。このメタデータはアノテーション(またはデフォルト)によって完全に表現できるため、デプロイメント・ディスクリプタXMLファイルはEJB 3.0では重要性が高くありません。デプロイメント・ディスクリプタXMLファイル内の構成により、対応するアノテーション構成がオーバーライドされます(存在する場合)。詳細は、「EJBデプロイメント・ディスクリプタ・ファイルについて」を参照してください。 |
図1-1に示すように、EJB 3.0 EJBインスタンスを取得するために、Webクライアント(サーブレットなど)またはJavaクライアントはJNDIを使用しますが、EJBクライアントはJNDIまたはリソース・インジェクションを使用できます。EJBクライアントの詳細は、「使用しているクライアントのタイプ」を参照してください。
エンティティBeanの場合、EJB 3.0はJPAエンティティの作成、検索、マージおよび維持に使用するEntityManager
を提供します(「JPAエンティティの問合せ方法」を参照)。
図1-1のクライアントは、EJBに次のようにアクセスします。
サーブレットまたはJavaクライアントは、JNDIを使用してCart
のインスタンスをルックアップします。
EJBクライアントは、Cart
インスタンス変数に@EJB
アノテーションを付けることによりリソース・インジェクションを使用します。実行時、EJBコンテナにより変数が適宜初期化されます。
どちらの場合も、EJBコンテナがインスタンス化を管理します。ホーム・インタフェースは不要です。
@Remove
アノテーションが付けられたBeanインスタンス内のメソッドを起動することにより、ステートフル・セッションBeanインスタンスを破棄できます。ステートレス・セッションBeanには、remove
メソッドは不要です。コンテナが必要に応じてBeanを削除します。コンテナは、構成されたタイムアウトを超えるステートフル・セッションBeanを削除するか、最大の構成済プール・サイズを維持できます。エンティティには、remove
メソッドは不要です。EJB 3.0 EntityManager
を使用してエンティティを作成および破棄します。
EJB 2.1を使用している場合、EJB実装のインタフェースはEJBのタイプに基づきます。たとえば、EJB 2.1エンティティBeanの実装では、javax.ejb.EntityBean
インタフェースを実装し、EJBHome
またはEJBLocalHome
、およびEJBObject
またはEJBLocalObject
を拡張する別のインタフェースを指定する必要があります。クライアントは、EJBホーム・インタフェースが提供するcreate
メソッドでのみEJB 2.1 Enterprise Beanインスタンスをインスタンス化できます。詳細は、「EJB 2.1サポート」を参照してください。
表1-3に、EJB 2.1 Enterprise Beanの開発時に作成する構成要素をリストします。
図1-2に示すように、クライアントは、ホーム・インタフェースを使用してEJB 2.1 Enterprise Beanインスタンスを取得し、コンポーネント・インタフェースを使用してビジネス・メソッドを起動します。EJBクライアントの詳細は、「使用しているクライアントのタイプ」を参照してください。
図1-2のクライアントは、EJBに次のようにアクセスします。
create
メソッドを起動します。これにより、Beanインスタンスが作成され、Beanのコンポーネント・インタフェース(リモートまたはローカル・インタフェース)への参照が返されます。
remove
メソッドを起動することにより、Beanのインスタンスを破棄できます。ステートレス・セッションBeanなどの一部のBeanでは、remove
メソッドをコールしても何も行われません。この場合は、コンテナがBeanインスタンスの削除を行います。
Enterprise Beanのライフ・サイクルには、作成、非アクティブ化、アクティブ化、削除などの重要イベントが関係します。
このような各イベントは、コールバック・メソッドに関連付けられています。ライフ・サイクル・コールバック・メソッドは、次のクラスで定義できます。
これらのオプションを組み合せて使用できます。たとえば、一部のライフ・サイクル・コールバックをセッションBeanクラスのメソッドとして定義し、一部をそのセッションBeanに関連付けられたインターセプタ・クラスに定義できます。
コンテナは、(イベント・タイプに応じて)ライフ・サイクル・イベントの前または直後にコールバックを起動します。
Enterprise Beanに関連付けられているライフ・サイクル・イベント、およびコンテナとBeanプロバイダのどちらがコールバックの実装を行うかは、(適切なEJBインタフェースで指定された)開発しているEnterprise Beanのタイプによって決まります。
EJB 3.0 Enterprise Beanでは、コンテナがライフ・サイクル・コールバックを行う場合は、追加ロジックを実行しないかぎりBeanに実装を提供する必要はありません。
EJB 2.1 Enterprise Beanでは、コンテナがライフ・サイクル・コールバックを行う場合、また追加ロジックを実行しない場合でも、少なくともライフ・サイクルの空の実装を用意して、該当するEJBインタフェースの要件を満たす必要があります。
詳細は、次を参照してください。
EJB 3.0 Enterprise Beanタイプの場合は、オプションで任意のEJBクラス・メソッドにライフ・サイクル・メソッドとしてアノテーションを付けることができます。
EJB 2.1 Enterprise Beanの場合は、少なくともライフ・サイクル・メソッドの空の実装を用意して、該当するEJBインタフェースの要件を満たす必要があります。
EJB 3.0セッションBeanまたはメッセージドリブンBeanの場合は、オプションでBeanクラスをインターセプタ・クラスに関連付け、任意のインターセプタ・クラス・メソッドにライフ・サイクル・メソッドとしてアノテーションを付けることができます。
詳細は、次を参照してください。
JPAエンティティの場合は、Beanクラスをエンティティ・リスナー・クラスに関連付け、任意のエンティティ・リスナー・クラス・メソッドにライフ・サイクル・メソッドとしてアノテーションを付けることができます。
詳細は、「JPAエンティティのエンティティ・リスナー・クラスのライフ・サイクル・コールバック・リスナー・メソッドの構成」を参照してください。
EJBContext
インタフェースは、EJB 2.1 Enterprise Beanインスタンスのコンテナ提供ランタイム・コンテキストへのアクセス権をインスタンスに提供します。このインタフェースは、エンタープライズ・インタフェースBeanタイプに固有の追加メソッドを提供するためにSessionContext
、EntityContext
およびMessageDrivenContext
インタフェースにより拡張されます。
javax.ejb.EJBContext
インタフェースの定義は次のとおりです。
public interface EJBContext { public EJBHome getEJBHome(); public Properties getEnvironment(); public Principal getCallerPrincipal(); public boolean isCallerInRole(String roleName); public UserTransaction getUserTransaction(); public boolean getRollbackOnly(); public void setRollbackOnly(); }
Beanは、表1-4に示された操作を実行する際、EJBコンテキストを必要とします。
EJBContext
をIntialContext
と混同しないようにしてください(「初期コンテキスト・ファクトリの構成」を参照)。
詳細は、次を参照してください。
アノテーションにより、アプリケーションの動作とデプロイを制御できます。メタデータ・アノテーションを使用して、コンテナ動作の適切な要件の指定、サービスやリソースの注入のリクエスト、およびオブジェクト・リレーショナル・マッピングの指定を行うことができます。
アノテーションを使用すると、EJB 3.0 Enterprise Beanは依存性注入メカニズムを使用して、環境内のリソースまたはその他のオブジェクトへの参照を取得できます。たとえば、次のアノテーションを使用できます。
@Resource
: データベース接続などのEJB以外のリソースを注入します。
@EJB
: セッションBeanなどのEnterprise Beanを注入します。
@PersistenceContext
: EJB 3.0エンティティを作成、参照、更新および削除するEntityManager
インスタンスを注入します。
EJB 3.0 Enterprise Beanが依存性注入を利用している場合、OC4JはBeanインスタンスの作成後、ビジネス・メソッドが起動される前にこれらの参照を注入します。
EJBコンテキストに対する依存性が宣言されている場合は、EJBコンテキストも注入されます(「EJBコンテキストとは」を参照)。
依存性注入に失敗した場合、OC4JはBeanインスタンスを破棄します。
OC4Jでは、アノテーションの継承がサポートされます(「アノテーションおよび継承」を参照)。
このリリースでは、Web層でアノテーションおよびリソース・インジェクションを使用できます(「Web層でのアノテーション」を参照)。
アノテーションは、XMLを使用せずに環境参照を指定する別の方法です。フィールドまたはプロパティにアノテーションを付ける場合、コンテナはJNDIからルックアップすることでユーザーにかわって値をBeanに注入します。参照がアノテーションを使用して指定されている場合でも、JNDIを使用してルックアップできます。例1-1に、アノテーションとJNDIの関連を示します。この例のアノテーションは、例1-2にある同等のejb-jar.xml
ファイルに対応しています。かわりにこのXMLとJNDIが使用された場合も、コードの動作はまったく同じです。
アノテーション構成は、デプロイXMLを使用してオーバーライドできます(「デプロイメント・ディスクリプタ・エントリによるアノテーションのオーバーライド」を参照)。
@Stateless
@EJB(name="bean1", businessInterface=Bean1.class)
public class MyBean {
@EJB Bean2 bean2;
public void doSomething() {
// Bean2 is already injected and available
bean2.foo();
// or it can be looked up from JNDI
((Bean2)(new InitialContext().lookup("java:comp/env/bean2"))).foo();
// Bean1 has not been injected and is only available through JNDI
((Bean1)(new InitialContext().lookup("java:comp/env/bean1"))).foo();
}
}
例1-2 同等のejb-jar.xmlファイル構成
<ejb-local-ref>
<ejb-ref-name>bean1</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>Bean1.class</local>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>bean2</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>Bean2.class</local>
<injection-target>
<injection-target-name>bean2</injection-target-name>
</injection-target>
</ejb-local-ref>
このリリースでは、OC4JによりWeb層でのアノテーションおよびリソース・インジェクションがサポートされます。Web層でアノテーションおよびリソース・インジェクションを使用するには、クライアントでJava SE 1.5およびServlet 2.5以上を使用している必要があります。
Web層では、次のアノテーションを使用できます。
@EJB
@Resource
および@Resources
@PersistenceUnit
および@PersistenceUnits
@PersistenceContext
および@PersistenceContexts
@WebServiceRef
@PostConstruct
@PreDestroy
@DeclaresRoles
@RunAs
詳細は、次を参照してください。
アノテーションは、継承に含まれます。アノテーションをホスト・クラスに対してローカルに機能させるには、次の点を考慮してください。
クラス・メンバーに影響しているアノテーションを検出するには、クラス・メンバーの最後の公開宣言または非オーバーライド宣言を追跡調査する必要があります。アノテーションを検出できない場合、エンクロージング・クラス宣言を調査する必要があります。これに失敗しても、他のソース・ファイルは調査しないでください。
表1-5に、アノテーションをリストし、各アノテーションがBeanクラスの継承に関してどのように動作するかを示します。
アプリケーション設計では、アノテーションとデプロイメント・ディスクリプタの使用を組み合せることができます。この場合、デプロイメント・ディスクリプタは、アノテーションのオーバーライド・メカニズムとして機能します。XMLディスクリプタを使用してアノテーションをオーバーライドするときに適用されるルールのリストは、EJB 3.0仕様を参照してください。
OC4Jでは、EJB 3.0仕様に定義されたアノテーション・オーバーライド・ルールがサポートされます。現在のリリースのOC4Jでは、デプロイメント・ディスクリプタによるオーバーライドがこれらのルールに違反すると、OC4Jにより警告が記録されてそのオーバーライドは無視され、アノテーション構成が使用されます。たとえば、あるクラスに@Stateful
アノテーションを付け、次にejb-jar.xml
ファイルの<entity>
エントリでこの設定をオーバーライドすると、Beanタイプはオーバーライドできないというオーバーライド・ルールに違反します。この場合、OC4Jは、警告を記録してオーバーライドを無視し、そのクラスを引き続きステートフル・セッションBeanとして処理します。
表1-6に、EJB 3.0仕様に定義されているXMLによるアノテーションのオーバーライド・ルールと、それらのルールに関するOC4J(リリース10.1.3.1、EJBレイヤー)の動作をリストします。
OC4Jでは、@EJB
および@Resource
のmappedName
属性がサポートされます。これらのアノテーションのmappedName
は、orion-ejb-jar.xml
に含まれるsession-deployment
、entity-deployment
およびmessage-driven-deployment
要素のlocation
属性と同じものです。
OC4Jでは、@Stateless
、@Stateful
または@MessageDriven
アノテーションのmappedName
属性はサポートされません。
セッションBeanは、単一のクライアント/サーバー・セッションの継続時間中、クライアントによって作成されるEJB 3.0またはEJB 2.1 Enterprise Beanコンポーネントです。セッションBeanは、クライアントの操作を実行します。セッションBeanはトランザクション対応ですが、システム障害の発生時にリカバリできません。セッションBeanオブジェクトは、ステートレス(「ステートレス・セッションBeanとは」を参照)またはステートフル(メソッド・コールおよびトランザクション間で対話状態を維持、「ステートフル・セッションBeanとは」を参照)です。セッションBeanが状態を維持する場合、OC4Jは、オブジェクトをメモリーから削除する必要がある場合にこの状態を管理します(「ステートフル・セッションBeanの非アクティブ化が発生する状況」を参照)。ただし、セッションBeanオブジェクトは自身の永続データを管理する必要があります。
クライアントの観点からは、セッションBeanは非永続オブジェクトであり、アプリケーション・サーバーで稼働するいくつかのビジネス・ロジックを実装します。たとえば、オンライン・ストア・アプリケーションでは、セッションBeanを使用して、Cart
インタフェースを提供するShoppingCartBean
を実装します。クライアントは、このインタフェースを使用して、purchaseItem
やcheckout
などのメソッドを起動します。
各クライアントには、固有のセッション・オブジェクトが割り当てられます。クライアントはセッションBeanのクラスのインスタンスに直接にはアクセスしません。クライアントは、Beanのホーム(「ホーム・インタフェースの実装」を参照)およびコンポーネント(「コンポーネント・インタフェースの実装」を参照)インタフェースを通じてセッション・オブジェクトにアクセスします。セッションBeanのクライアントは、Beanにより提供されるインタフェースおよびクライアントにより使用されるインタフェースに応じて、ローカル・クライアント、リモート・クライアントまたはWebサービス・クライアント(ステートレス・セッションBeanのみ)となります。
OC4Jは、各セッションBeanインスタンスのセッション・コンテキスト(「セッション・コンテキストとは」を参照)を維持します。このセッション・コンテキストを使用して、コンテナにコールバック・リクエストを行います。
この項の内容は次のとおりです。
詳細は、次を参照してください。
ステートレス・セッションBeanは、対話状態のないセッションBeanです。特定のステートレス・セッションBeanクラスのインスタンスはすべて同一です。
ステートレス・セッションBeanおよびそのクライアントは、メソッド間で状態または識別情報を共有しません。ステートレス・セッションBeanは、1回のみ起動可能なBeanです。特定のクライアントに固有ではない、再利用可能なビジネス・サービスで使用されます。たとえば、一般的な為替換算、ローン金利の計算などに使用されます。ステートレス・セッションBeanには、クライアントから独立した、コール間に渡る読取り専用の状態が格納される場合があります。その後のコールは、プール内の他のステートレス・セッションBeanによって処理されます。情報は、1回の起動中にのみ使用されます。
OC4Jは、複数のクライアントを処理するために、これらのステートレスBeanのプールを維持しています。クライアントがリクエストを送信すると、プールからインスタンスが取得されます。Beanの情報を初期化する必要はありません。
ステートレス・セッションBeanのクライアントは、Webサービス・クライアントである場合があります。Webサービス・クライアント・ビューを提供できるのは、ステートレス・セッションBeanのみです。
詳細は、次を参照してください。
図1-3に、ステートレス・セッションBeanのライフ・サイクルを示します。@PostConstruct
などのアノテーションは、EJB 3.0のステートレス・セッションBeanにのみ適用されます。
EJB 3.0とEJB 2.1のステートレス・セッションBeanのライフ・サイクルは同一です。違いは、ライフ・サイクル・コールバック・メソッドの登録方法です(表1-7および表1-8を参照)。
表1-7に、アノテーションを使用して定義できるEJB 3.0ステートレス・セッションBeanのオプションのライフ・サイクル・コールバック・メソッドをリストします。EJB 3.0ステートレス・セッションBeanでは、これらのメソッドを実装する必要はありません。
表1-8に、javax.ejb.SessionBean
インタフェースでの指定に従って、ステートフル・セッションBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドをリストします。EJB 2.1ステートフル・セッションBeanでは、最低でも、すべてのコールバック・メソッド用に空の実装を用意する必要があります。
EJBメソッド | 説明 |
---|---|
|
コンテナは、Beanの作成直前にこのメソッドを起動します。このメソッドを使用して、データソースの取得など、クライアントに固有でない情報を初期化します。 |
|
このメソッドは、ステートレス・セッションBeanに対しては決してコールされません。空の実装のみ用意します。 |
|
このメソッドは、ステートレス・セッションBeanに対しては決してコールされません。空の実装のみ用意します。 |
|
コンテナは、ステートレス・セッションBeanを破棄する前にこのメソッドを起動します。このメソッドを使用して、データソースなどの外部リソースのクローズなど、必要なクリーンアップを実行します。 |
|
コンテナは、Beanを最初にインスタンス化した後にこのメソッドを起動します。このメソッドを使用して、Beanのコンテキストの参照を取得します。詳細は、「setSessionContextメソッドの実装」を参照してください。 |
詳細は、次を参照してください。
ステートフル・セッションBeanは、対話状態を維持するセッションBeanです。
ステートフル・セッションBeanは、対話型セッションで使用します。対話型セッションでは、インスタンス変数値やトランザクションの状態などをメソッド間で維持する必要があります。これらのセッションBeanは、単一クライアントの存続期間中、そのクライアントにマッピングされます。
ステートフル・セッションBeanは、メソッド・コール間で状態を維持します。したがって、各クライアントに対し、ステートフル・セッションBeanのインスタンスが1つずつ作成されます。それぞれのステートフル・セッションBeanには、個別のクライアントの識別情報と、1対1のマッピングが含まれています。
コンテナが、(リソースを解放するために)メモリーからステートフル・セッションBeanを削除する必要があると判断した場合、コンテナは非アクティブ化(ディスクへのBeanのシリアライズ)によってBeanの状態を維持します。そのため、非アクティブ化する状態はシリアライズ可能である必要があります。ただし、システム障害が発生した場合、この情報は維持されません。Beanのインスタンスがクライアントによって再びリクエストされると、コンテナは以前に非アクティブ化したBeanインスタンスをアクティブ化します。
保存される状態のタイプには、リソースは含まれません。コンテナによりBean内のejbPassivate
メソッドが起動され、Beanがリソースのクリーンアップを行います。これらのリソースには、保持されたソケット、データベース接続、および静的情報が含まれているハッシュテーブルなどがあります。これらのリソースは、すべてejbActivate
メソッド中に再割当ておよび再作成可能です。
Beanのインスタンスでエラーが発生すると、Bean内で継続的に状態を保存するアクションを実行していないかぎり、状態が失われます。ただし、フェイルオーバーに備えて常に状態を保存する必要がある場合、実装にエンティティBeanを使用することをお薦めします。または、SessionSynchronization
インタフェースを使用して、状態をトランザクションによって維持することも可能です。
たとえば、ステートフル・セッションBeanは、ショッピング・カート・オンライン・アプリケーションのサーバー・サイドを実装可能です。このアプリケーションには、購入可能な商品のリストを返し、アイテムを顧客のショッピング・カートに入れ、発注を行い、顧客のプロファイルを変更するなどの作業を行うためのメソッドが含まれます。
詳細は、次を参照してください。
図1-4に、ステートフル・セッションBeanのライフ・サイクルを示します。@PostConstruct
などのアノテーションは、EJB 3.0のステートフル・セッションBeanにのみ適用されます。
EJB 3.0とEJB 2.1のステートフル・セッションBeanのライフ・サイクルは同一です。違いは、ライフ・サイクル・コールバック・メソッドの登録方法です(表1-9および表1-10を参照)。
表1-9に、アノテーションを使用して定義できるEJB 3.0ステートフル・セッションBeanのオプションのライフ・サイクル・コールバック・メソッドをリストします。EJB 3.0ステートフル・セッションBeanでは、これらのメソッドを実装する必要はありません。
表1-10に、javax.ejb.SessionBean
インタフェースでの指定に従って、ステートフル・セッションBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドをリストします。EJB 2.1ステートフル・セッションBeanでは、最低でも、すべてのコールバック・メソッド用に空の実装を用意する必要があります。
EJBメソッド | 説明 |
---|---|
|
コンテナは、Beanの作成直前にこのメソッドを起動します。ステートレス・セッションBeanは、このメソッドでは何も行いません。ステートフル・セッションBeanは、このメソッドで状態を初期化可能です。 |
|
コンテナは、Beanを再びアクティブ化した直後にこのメソッドを起動します。 |
|
コンテナは、Beanを非アクティブ化する直前にこのメソッドを起動します。詳細は、次を参照してください。 |
|
コンテナは、セッション・オブジェクトを破棄する前にこのメソッドを起動します。このメソッドにより、ファイル・ハンドルなどの外部リソースのクローズなど、必要なクリーンアップが実行されます。 |
|
コンテナは、Beanを最初にインスタンス化した後にこのメソッドを起動します。このメソッドを使用して、Beanのコンテキストの参照を取得します。詳細は、「setSessionContextメソッドの実装」を参照してください。 |
詳細は、次を参照してください。
非アクティブ化を使用すると、コンテナは、Beanとその状態を2次記憶装置にシリアライズしてメモリーから削除することによって、非アクティブなアイドル状態のBeanインスタンスの対話状態を保持できます。非アクティブ化の前に、コンテナはPrePassivate
またはejbPassivate
メソッドを起動し、データベース接続、TCP/IPソケットまたはオブジェクトのシリアライズによって透過的に非アクティブ化されないリソースなど、保持されたリソースをBean開発者がクリーンアップできるようにします。特定のオブジェクト・タイプのみシリアライズおよび非アクティブ化できます(「非アクティブ化できるオブジェクト・タイプ」を参照)。
非アクティブ化はデフォルトで有効化されています。非アクティブ化の有効化および無効化の詳細は、「非アクティブ化の構成」を参照してください。
OC4Jは、次の基準の任意の組合せが満たされる場合にステートフル・セッションBeanを非アクティブ化します。
Beanの非アクティブ化は、最低使用頻度アルゴリズムを使用して実行されます。つまり、非アクティブ化に対して適格なBeanのうち、OC4Jは使用頻度が最低のBeanを最初に非アクティブ化します。
また、OC4Jがこの基準をチェックする頻度および基準が満たされたときに非アクティブ化するインスタンス数を指定できます。
この基準の構成の詳細は、「非アクティブ化基準の構成」を参照してください。
非アクティブ化時のシリアライズに失敗した場合、コンテナはBeanをメモリーにリカバリして、処理前の状態にしようとします。非アクティブ化に失敗したBeanについては、その後非アクティブ化は試行されません。また、アクティブ化に失敗した場合、Beanとその参照はコンテナから完全に削除されます。
非アクティブ化されたBeanインスタンスのメソッドの1つをクライアントが起動すると、Beanを2次記憶装置からデシリアライズしてメモリーに戻すことによって、保持されていた対話状態のデータがアクティブ化されます。アクティブ化の前に、コンテナはejbActivate
メソッドを起動し、ejbPassivate
時に解放したリソースを開発者がリストアできるようにします。非アクティブ化の詳細は、EJBの仕様を参照してください。
ステートフル・セッションBeanでは、「非アクティブ化できるオブジェクト・タイプ」に示されている特定のタイプのオブジェクトのみが非アクティブ化されます。ユーザーがすべてのリソースを解放し、使用可能なタイプのオブジェクト内でのみ状態が存在するようにして、ステートフル・セッションBeanを非アクティブ化する準備をしていない場合、非アクティブ化は常に失敗します。
クラスタ内の非アクティブ化されたBeanに対して新規Beanデータが伝播されると、そのBeanインスタンスのデータは、伝播されたデータによって上書きされます。
ステートフル・セッションBeanが非アクティブ化されると、そのBeanは2次記憶装置にシリアライズされます。シリアライズが成功するために、Beanの対話状態は、プリミティブ値と次のデータ型のみで構成されている必要があります。
SessionContext
オブジェクトの参照
java:comp/env
JNDIコンテキスト)またはその任意のサブコンテキストの参照
UserTransaction
インタフェースの参照
EntityManager
オブジェクトの参照
EntityManagerFactory
オブジェクトの参照
javax.ejb.Timer
オブジェクトの参照
SessionContext
オブジェクトへの参照、java:comp/env
JNDIコンテキストとそのサブコンテキストへの参照、UserTransaction
インタフェースへの参照、およびEntityManager
またはEntityManagerFactory
(あるいはその両方)への参照を置換することでシリアライズ可能になるオブジェクト
PrePassivate
メソッド(「EJB 3.0セッションBeanのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)またはejbPassivate
メソッド(「EJB 2.1セッションBeanのライフ・サイクル・コールバック・メソッドの構成」を参照)の完了後に、すべての非一時的フィールドがこれらの型であることを確認してください。このメソッド内では、すべての一時フィールドまたは非シリアライズ可能フィールドをNULLに設定する必要があります。
デフォルトでは、OC4Jは、ステートフル・セッションBeanを非アクティブ化したときに、シリアライズされたインスタンスを<
OC4J_HOME
>¥j2ee¥home¥persistence
に書き込みます。
非アクティブ化によってこのディレクトリ内の領域が使用され、非アクティブ化されたBeanが格納されます。非アクティブ化によって大量のディスク領域が割り当てられる場合は、使用可能な領域があるシステム上の別の場所にディレクトリを変更してください(「非アクティブ化の場所の構成」を参照)。
OC4Jは、各セッションBeanインスタンスのjavax.ejb.SessionContext
を維持し、このセッション・コンテキストをBeanに対して使用可能にします。Beanは、セッション・コンテキスト内のメソッドを使用して、コンテナへのコールバック・リクエストを送信できます。また、EJBContext
から継承されたメソッドを使用できます(「EJBコンテキストとは」を参照)。
詳細は、次を参照してください。
OC4Jは、最初にBeanをインスタンス化した後で、セッション・コンテキストを初期化します。Beanがセッション・コンテキストを取得できるようにするのは、Beanプロバイダの役割です。コンテナは、トランザクション・コンテキストからはこのメソッドをコールしません。この時点でBeanがセッション・コンテキストを保存しなかった場合、Beanは二度とセッション・コンテキストにアクセスできなくなります。
コンテナはこのメソッドをコールする際、SessionContext
オブジェクトの参照をBeanに渡します。Beanは、この参照を後の使用のために格納できます。
オブジェクトが参照する対話状態をセッションBeanインスタンスが(setSessionContext
メソッドまたはリソース・インジェクションを使用して)SessionContext
に格納する場合、OC4Jはインスタンスの非アクティブ化の後も参照を保存およびリストアできます。OC4Jは、アクティブ化の際に、別の機能的に同等のSessionContext
オブジェクトで元のSessionContext
オブジェクトを置換できます。
Java Enterprise Edition 5(Java EE 5)EJB 3.0仕様の一部であるJava永続性API(JPA)により、Javaの永続性は大幅に簡略化されています。このAPIを使用すると、オブジェクト・リレーショナル・マッピング・アプローチを通じて、Java EE 5アプリケーション・サーバーの内部とJava Standard Edition 5(Java SE 5)アプリケーションのEJBコンテナの外部で動作する標準的で移植可能な方法に基づいて、Javaオブジェクトをリレーショナル・データベース表にマッピングする方法を宣言的に定義できます。
JPAを使用すると、JPAエンティティとして任意のPOJOクラスを指定できます。このJavaオブジェクトには、(Java EE EJBコンテナの内部またはJava SEアプリケーションのEJBコンテナの外部にある)JPA永続性プロバイダから取得されるエンティティ・マネージャのサービスを通じてリレーショナル・データベースに永続化される非一時的フィールドが含まれます。
エンティティには、次の特徴があります。
エンティティは、コンテナ管理の永続性を使用してリレーショナル・データベースに自動的に格納される永続データを表します。各データはデータベースなどのデータ記憶域システムの形式で永続的に格納されるため、これらのエンティティは永続的です。サーバー障害、フェイルオーバー、ネットワーク障害が発生しても存続し続けます。エンティティが再びインスタンス化されると、以前のインスタンスの状態が自動的にリストアされます。
エンティティは、ビジネス・エンティティをモデル化するか、または単一のビジネス・プロセス内の複数のアクションをモデル化します。エンティティは、データを使用するビジネス・サービスの提供、およびそのデータの計算によく使用されます。たとえば、開発者が、発注されたアイテムを取得し計算するエンティティを実装する場合があります。エンティティで、タスクの実行中に複数の依存性のある永続オブジェクトを管理できます。
エンティティは、リモートにアクセス可能なコンポーネントではないため、ファイングレインな永続オブジェクトを表すことができます。
エンティティはオブジェクトを集約し、JPA永続性プロバイダのトランザクション、セキュリティおよび同時実行性サービスを使用してデータと関連オブジェクトを効率的に維持できます。
この項の内容は次のとおりです。
詳細は、第6章「JPAエンティティの実装」を参照してください。
コンテナ管理の永続性フィールドは、データベースに保存する必要のあるデータを表す状態フィールドです。
@Transient
アノテーションを付けないかぎり、JPAエンティティのすべてのデータ・メンバーは永続性フィールドとみなされます。
エンティティの永続性ユニットで指定されるJPA永続性プロバイダ(「persistence.xmlファイルとは」を参照)により、永続性フィールドがデータベースに永続化されることが保証されます。
デフォルトでは、JPA永続性プロバイダにより、ほとんどのJavaプリミティブ型、プリミティブ型のラッパーおよび列挙の基本マッピングが自動的に構成されます。このマッピングは、@Basic
、@Enumerated
、@Temporal
および@Lob
アノテーションを使用してカスタマイズできます。
コンテナ管理の関連性(CMR)フィールドは、1つ以上の他のEJB 3.0エンティティまたはEJB 2.1コンテナ管理エンティティBeanとの永続関係を表す関連付けフィールドです。たとえば、受注管理アプリケーションでは、OrderEJB
はLineItemEJB
Beanのコレクションおよび単一のCustomerEJB
Beanに関連している場合があります。
@Transient
アノテーションを付けないかぎり、JPAエンティティのすべてのデータ・メンバーは永続性フィールドとみなされます。
エンティティの永続性ユニットで指定されるJPA永続性プロバイダ(「persistence.xmlファイルとは」を参照)により、永続性フィールドがデータベースに永続化されることが保証されます。
アノテーションまたはpersistence.xml
を使用してエンティティを構成し、他のエンティティに対するマッピングを指定する必要があります。この構成により、エンティティ間の相互関係と、JPA永続性プロバイダでリレーショナル・データベースに参照をマッピングする方法を指定します。
たとえば、関連マッピング・アノテーションの@OneToOne
、@ManyToOne
、@OneToMany
および@ManyToMany
を使用して、任意の永続関係の関連マッピングを構成できます。
エンティティ関連(E-R)には、次の特徴があります。
ProjectEJB
Beanは複数のTaskEJB
Beanが属していることを認識し、各TaskEJB BeanはProjectEJB
Beanに属していることを認識している場合、これらのBeanには双方向の関連があります。単方向の関連の場合、1つのエンティティBeanにのみ他のBeanを参照する関連フィールドがあります。Oracle Application Serverは、Enterprise Bean間の双方向と単方向の両方の関連をサポートしています。
JOIN
、GROUP BY
、HAVING
、投影、副問合せおよび名前付きパラメータの機能が追加されています。この言語では、静的問合せと動的問合せの両方がサポートされます。JP QL問合せは、多くの場合、複数の関連をナビゲートします。関連の方向によって、問合せでBean間をナビゲートできるかどうかが決まります。
詳細は、次を参照してください。
図1-5に、JPAエンティティのライフ・サイクルを示します。
表1-11に、アノテーションを使用して定義できるJPAエンティティのオプションのライフ・サイクル・コールバック・メソッドをリストします。EJB 3.0エンティティでは、これらのメソッドを実装する必要はありません。
詳細は、次を参照してください。
各JPAエンティティには、他のインスタンスから一意に識別するための主キーが存在する必要があります。主キー(または主キーとなる複合キー内のフィールド)は、永続フィールドである必要があります。
主キー内のすべてのフィールドは次の型に制限されます。
このリリースでは、単一の一般的なシリアライズ可能Javaプリミティブまたはオブジェクト型から構成される主キーを定義できます。Beanクラス内で宣言される主キー変数は、public
として宣言する必要があります(「JPAエンティティの単純な主キー・フィールドの構成」を参照)。
主キー値を自分で割り当てるか、より一般的には自動生成された主キーを作成できます(「JPAエンティティの自動主キー生成の構成」を参照)。
詳細は、「JPAエンティティの主キーの構成」を参照してください。
EJB 3.0では、javax.persistence.EntityManager
を使用してEJB 3.0エンティティを作成、検索、マージおよび維持します。エンティティを検索するには、EntityManager
問合せAPIを使用します(「JPA EntityManager問合せAPIについて」を参照)。
適切な問合せ構文を使用して、選択基準を表現できます(「JPAエンティティの問合せ構文について」を参照)。
問合せヒントを使用すると、EJB 3.0 JPA永続性プロバイダでこのAPIのベンダー拡張を使用できます(「JPA問合せでのTopLink問合せヒントの構成」を参照)。
EJB 3.0では、javax.persistence.EntityManager
およびjavax.persistence.Query
APIを使用して名前付き問合せまたは動的問合せを作成および実行できます。
Query
APIを使用して、パラメータのバインド、ヒントの構成および返される結果数の制御を行うことができます。
詳細は、次を参照してください。
名前付き問合せは、EJB 2.1 finderメソッドをEJB 3.0で改良したものです。EJB 3.0では、メタデータを使用して名前付き問合せを実装でき(「JPA名前付き問合せの実装」を参照)、実行時に名前を指定して問合せを作成および実行できます(「EntityManagerでの名前付き問合せの作成」を参照)。
OC4Jでは、Java永続性問合せ言語とネイティブSQLの名前付き問合せの両方がサポートされます。
動的問合せは、実行時に作成、構成および実行できる問合せです。名前付き問合せに加えて動的問合せを使用できます。
OC4Jでは、Java永続性問合せ言語とネイティブSQLの名前付き問合せの両方がサポートされます。
TopLink問合せおよび式フレームワークを使用して動的問合せを作成することもできます(「EntityManagerを使用した動的TopLink式問合せの作成」を参照)。
表1-12に、JPAエンティティの問合せの定義に使用できる問合せ構文のタイプをまとめます。
問合せ構文 | 参照先 |
---|---|
Java永続性問合せ言語 |
|
ネイティブSQL |
移植と最適化が可能なため、Java永続性問合せ言語の使用をお薦めします。
Java永続性問合せ言語は、移植と最適化が可能な形式で問合せセマンティクスを定義するために使用できる指定言語です。
SQLと似ていますが、Java永続性問合せ言語はネイティブSQLよりもはるかに優れています。SQLでは列名を使用して表に対して問合せを行いますが、Java永続性問合せ言語では、Beanの抽象スキーマ名およびフィールドを問合せ内で使用し、EJB 3.0エンティティに対して問合せを行います。Java永続性問合せ言語の文では、オブジェクト用語を使用します。JPA永続性プロバイダは、アプリケーションのデプロイ時に、Java永続性問合せ言語の文を適切なデータベースSQL文に変換します。したがって、JPA永続性プロバイダは、エンティティ名とその永続フィールド名を、適切なデータベース表名と列名に変換します。Java永続性問合せ言語は、OC4Jでサポートされているすべてのデータベースに移植可能です。
EJB 3.0では、Java永続性問合せ言語構文にはEJB 2.1 EJB QL(「EJB 2.1問合せ構文について」を参照)のすべての機能に加えて、バルク更新と削除、JOIN
操作、GROUP BY
、HAVING
、投影、副問合せ、EJB 3.0のEntityManager
APIを使用した動的問合せ(「JPA動的(非定型)問合せ」を参照)でのJava永続性問合せ言語の使用などの追加機能があります。
詳細は、JSR-220 Enterprise JavaBeansバージョン3.0のJava永続性API仕様の第4章を参照してください。
OC4Jでは、Java永続性問合せ言語を次の重要な機能とともにサポートしています。
EJB 3.0を使用した場合、OC4Jでは、SQRTや日付、時刻、タイムスタンプの各オプションなど、EJB 3.0永続性仕様で定義されているすべての拡張Java永続性問合せ言語機能がサポートされます。
このリリースでは、TopLink JPA永続性プロバイダは、指定された問合せ構文を受け取り(「JPAエンティティの問合せ構文について」を参照)、基礎となるリレーショナル・データベースに固有のStructured Query Language(SQL)を生成します。
Java永続性問合せ言語は、移植と最適化が可能なため、推奨される構文です。
ネイティブSQLは、Java永続性問合せ言語でサポートされない基礎となるリレーショナル・データベースの高度な問合せ機能を利用する場合に適しています。
OC4Jでは、名前付き問合せと動的問合せの両方でネイティブSQLがサポートされます。
エンティティBeanはEJB 2.1 Enterprise Beanコンポーネントであり、永続データの管理および複雑なビジネス・ロジックの実行を行います。複数の依存性のあるJavaオブジェクトを使用可能で、主キーによって一意に識別可能です。
エンティティBeanは、次のいずれかの方法により、ビジネス・データを永続的にします。
コンテナ管理の永続性アーキテクチャとBean管理の永続性アーキテクチャを選択する方法の詳細は、「Bean管理の永続性を使用する場合とコンテナ管理の永続性を使用する場合」を参照してください。
エンティティBeanのデータはデータベースなどのデータ記憶域の形式で永続的に格納されるため、エンティティBeanは永続的です。サーバー障害、フェイルオーバー、ネットワーク障害が発生しても存続し続けます。エンティティBeanが再びインスタンス化されると、以前のインスタンスの状態が自動的にリストアされます。OC4Jは、エンティティBeanをメモリーから削除する必要がある場合にこの状態を管理します(「エンティティBeanの非アクティブ化が発生する状況」を参照)。
エンティティBeanは、ビジネス・エンティティをモデル化するか、または単一のビジネス・プロセス内の複数のアクションをモデル化します。エンティティBeanは、データを使用するビジネス・サービスの提供、およびそのデータの計算によく使用されます。たとえば、開発者が、発注されたアイテムを取得し計算するエンティティBeanを実装する場合があります。エンティティBeanで、タスクの実行中に複数の依存性のある永続オブジェクトを管理できます。
一般的な設計パターンでは、エンティティBeanをクライアント・インタフェースとして機能するセッションBeanと対にします。エンティティBeanは、機能をカプセル化し、永続データおよび依存オブジェクト(通常はファイングレイン)との関連を表すコースグレインなオブジェクトとして機能します。したがって、クライアントをデータから分離できるため、データが変更されてもクライアントは影響を受けません。効率を上げるため、セッションBeanをエンティティBeanと同一JVM上に置き、ローカル・インタフェースを通じて複数のエンティティBean間を調整できます。これは、セッション・ファサード・デザインと呼ばれます。セッション・ファサード・デザインの詳細は、Webサイトhttp://java.sun.com
を参照してください。
エンティティBeanはオブジェクトを集約し、コンテナのトランザクション、セキュリティおよび同時実行性サービスを使用してデータと関連オブジェクトを効率的に維持できます。
この項の内容は次のとおりです。
詳細は、第13章「EJB 2.1エンティティBeanの実装」を参照してください。
エンティティBeanの永続データをコンテナで管理することを選択した場合は、コンテナ管理の永続性を備えたエンティティBeanを定義します。コンテナ管理の永続性を備えたエンティティBeanのクラスは、抽象クラス(コンテナが、実行時に使用される実装クラスを提供する)であり、その永続データは、単純なデータに対してはコンテナ管理の永続性フィールド(「コンテナ管理の永続性フィールドとは」を参照)として指定され、コンテナ管理の永続性を備えた他のエンティティBeanとの関連に対してはコンテナ管理の関連性フィールド(「コンテナ管理の関連性フィールドとは」を参照)として指定されます。この場合、コンテナにより、永続データのデータベースへの格納およびリロードが行われるため、Beanのデータの永続性を管理するための一部のコールバック・メソッドを実装する必要がありません(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル」を参照)。コンテナ管理の永続性を使用する場合、コンテナが永続的マネージャ・クラスを起動し、これによって永続的管理ビジネス・ロジックが提供されます。OC4Jでは、TopLink永続性マネージャがデフォルトで使用されます。さらに、主キー(「コンテナ管理の永続性を備えたエンティティBeanの主キー」を参照)用の管理を提供する必要がありません。コンテナによってBeanのキーが提供されます。
詳細は、次を参照してください。
コンテナ管理の永続性フィールドは、データベースに保存する必要のあるデータを表す状態フィールドです。
コンテナ管理の永続性フィールドを指定することで、OC4Jに対して、フィールドの値を必ずデータベースに保存するよう指示します。コンテナ管理の永続性を備えたエンティティBeanの他のすべてのフィールドは、非永続(一時的)とみなされます。
EJB 2.1を使用した場合は、コンテナ管理の永続性フィールドを明示的に指定する必要があります(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の永続性フィールドの構成」を参照)。
コンテナ管理の関連性フィールドは、コンテナ管理の永続性を備えた他の1つ以上のエンティティBeanとの永続関係を表す関連付けフィールドです。たとえば、受注管理アプリケーションでは、OrderEJB
はLineItemEJB
Beanのコレクションおよび単一のCustomerEJB
Beanに関連している場合があります。
コンテナ管理の関連性フィールドを指定することで、OC4Jに対して、コンテナ管理の永続性を備えた1つ以上の関連エンティティBeanへの参照を必ずデータベースに保存するよう指示します。このため、コンテナ管理の永続性を備えたエンティティBean間の関連性は、コンテナ管理の関連性(またはコンテナ管理の永続性を備えたあるエンティティBeanから別のエンティティBeanへのマッピング)と呼ばれることがあります。
コンテナ管理の関連性には次の特性があります。
ProjectEJB
Beanは複数のTaskEJB
Beanが属していることを認識し、各TaskEJB BeanはProjectEJB
Beanに属していることを認識している場合、これらのBeanには双方向の関連があります。単方向の関連の場合、1つのエンティティBeanにのみ他のBeanを参照する関連フィールドがあります。Oracle Application Serverは、Enterprise Bean間の双方向と単方向の両方の関連をサポートしています。
詳細は、次を参照してください。
図1-6に、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクルを示します。
表1-13に、javax.ejb.EntityBean
インタフェースでの指定に従って、コンテナ管理の永続性を備えたエンティティBeanが実装する必要のあるEJB 2.1 Enterprise Beanのライフ・サイクル・メソッドをリストします。コンテナ管理の永続性を備えたEJB 2.1エンティティBeanでは、最低でも、すべてのコールバック・メソッド用に空の実装を用意する必要があります。
詳細は、次を参照してください。
各エンティティBeanには、他のインスタンスから一意に識別するための主キーが存在します。主キー(または主キーとなる複合キー内のフィールド)を、デプロイメント・ディスクリプタのコンテナ管理による永続的フィールドとして宣言する必要があります。
主キー内のすべてのフィールドは次の型に制限されます。
主キーは、次のいずれかの方法で定義できます。
public
として宣言する必要があります(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成」を参照)。
name
>PK
クラス内の1つ以上の一般的なシリアライズ可能Javaプリミティブ型およびオブジェクト型から構成されるコンポジット主キー・クラスを定義します(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのコンポジット主キー・クラスの構成」を参照)。
通常は、OC4Jによって自動的に主キー値が割り当てられます。OC4Jによる主キー値の割当て方法を構成するには、TopLink永続性APIを使用します。詳細は、次を参照してください。
詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キーの構成」を参照してください。
エンティティBeanの永続データを自分で管理することを選択した場合は、Bean管理の永続性を備えたエンティティBeanを定義します。Bean管理の永続性を備えたエンティティBeanのクラスは、具象クラス(実行時に使用される実装をユーザーが提供)であり、その永続データは、単純なデータに対してはBean管理の永続性フィールド(「Bean管理の永続性フィールドとは」を参照)として指定され、Bean管理の永続性を備えた他のエンティティBeanとの関連に対してはBean管理の関連性フィールド(「Bean管理の関連性フィールドとは」を参照)として指定されます。この場合、すべてのコールバック・メソッドを実装して、永続データのデータベースへの格納およびリロードなど、Beanのデータの永続性を管理する必要があります(「Bean管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル」を参照)。Bean管理の永続性を使用する場合は、永続性管理ビジネス・ロジックを実現するコードを提供する必要があります。また、主キーの管理を提供する必要があります(「Bean管理の永続性を備えたエンティティBeanの主キー」を参照)。
Bean管理の永続性を備えたエンティティBeanを読取り専用として指定し(「Bean管理の永続性を備えた読取り専用エンティティBeanの構成」を参照)、選択するコミット・オプションに応じてOC4JがBean管理の永続性を備えた読取り専用エンティティBeanを提供する最適化を利用できます(「エンティティBeanのコミット・オプション」を参照)。
詳細は、次を参照してください。
Bean管理の永続性を使用する場合は、記述するコードによって、Bean管理の永続性を備えたエンティティBeanで維持されるフィールドが決まります。
Bean管理の永続性を使用する場合は、記述するコードによって、Bean管理の永続性を備えたエンティティBean間の関連が実装されます。
表1-14に、javax.ejb.EntityBean
インタフェースでの指定に従って、Bean管理の永続性を備えたエンティティBeanが実装する必要のあるライフ・サイクル・メソッドをリストします。
Bean管理の永続性を備えたエンティティBeanの場合は、すべてのライフ・サイクル・メソッドの完全な実装を提供する必要があります。
詳細は、次を参照してください。
エンティティBeanの主キーは、特定のタイプのエンティティBeanクラスのインスタンスを別のインスタンスと区別する、一意に識別可能な値です。各エンティティBeanには、永続的な識別情報が関連付けられています。つまり、主キーを保有している場合に取得可能な一意の識別情報が含まれています。主キーがあれば、クライアントはエンティティBeanを取得可能です。Beanが使用不可の場合、コンテナはBeanをインスタンス化し、永続データを再移入します。
一意のキーのタイプは、Beanプロバイダによって定義されています。
主キー内のすべてのフィールドは次の型に制限されます。
hashCode()
およびequals(Object)
メソッドの適切な実装を提供する型
主キーは、次のいずれかの方法で定義できます(どちらの場合も、Bean管理の永続性を備えたエンティティBeanの場合は、ejbCreate
メソッドで主キーを作成します)。
public
として宣言する必要があります(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成」を参照)。
name
>PK
クラス内のシリアライズ可能なオブジェクトとして定義します(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの主キー・クラスの構成」を参照)。
OC4Jは、コンテナ管理の永続性を備えた各EJB 2.1エンティティBeanまたはBean管理の永続性を備えたエンティティBeanインスタンスのjavax.ejb.EntityContext
を維持し、このエンティティ・コンテキストをBeanに対して使用可能にします。Beanは、エンティティ・コンテキスト内のメソッドを使用して、コンテナへのコールバック・リクエストを送信できます。また、EJBContext
から継承されたメソッドを使用できます(「EJBコンテキストとは」を参照)。
詳細は、次を参照してください。
エンティティBeanの非アクティブ化は、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにのみ適用されます。
OC4Jは、コンテナがエンティティ・オブジェクト識別情報からインスタンスの関連付けを解除すること、また使用可能なインスタンスのプールにインスタンスを戻すことを決定したときに、インスタンスを非アクティブ化します。OC4Jは、インスタンスのejbPassivate
メソッドをコールして、インスタンスがプールにある間は保持できないリソース(通常はejbActivate
メソッドに割り当てられている)を解放する機会をインスタンスに与えます。このメソッドは、未指定のトランザクション・コンテキストで実行されます。エンティティBeanは、このメソッド中にアクセッサ・メソッドを使用して永続状態または関連へのアクセスを試行することはできません。
コミット・オプションにより、トランザクション・コミット時にエンティティBeanインスタンスの状態が決定され、OC4Jが特定のアプリケーション条件を最適化できる柔軟性が提供されます。
表1-15に、EJB 2.1仕様によって定義されているコミット・オプションをリストし、OC4Jでサポートされるオプションを示します。
コミット・オプション | OC4Jサポート | 説明 | インスタンス状態がデータベースに書き込まれるか | インスタンスは準備完了 | インスタンス状態は有効なまま | 利点 | 短所 |
---|---|---|---|---|---|---|---|
A |
![]() |
キャッシュされたBean: トランザクションの最後に、インスタンスは準備完了状態(キャッシュ済)になり、インスタンス状態は有効です(アクティブ化の後に |
![]() |
![]() |
![]() |
データベース・アクセスが最も少なくなります。 |
複数スレッドが同じBeanインスタンスを共有します(パフォーマンスが悪くなる)。 |
B |
![]() |
失効Bean: トランザクションの最後に、インスタンスは準備完了状態(キャッシュ済)になりますが、インスタンス状態は無効です。トランザクションごとに |
![]() |
![]() |
![]() |
同時リクエストが可能です。 |
同じデータを表す複数のBeanインスタンスのオーバーヘッドが生じます。
各トランザクションが |
C |
![]() |
プールされたBean: トランザクションの最後に、インスタンスもその状態も無効になります(インスタンスは非アクティブ化され、プールに返される)。すべてのクライアント・コールで、 |
![]() |
![]() |
![]() |
接続を保持する必要がありません。 |
データベース・アクセスが最も多くなります(ビジネス・メソッド・コールのたび)。 キャッシングが行われません。 |
1
Bean管理の永続性を備えたエンティティBeanのみ(「コミット・オプションおよびBMPアプリケーション」を参照)。 2 コンテナ管理の永続性を備えたエンティティBeanのみ(「コミット・オプションおよびCMPアプリケーション」を参照)。 |
TopLink永続性マネージャを使用してOC4JにデプロイされたEJB 2.1 CMPアプリケーションでは、デフォルトで、OC4Jはコミット・オプションCに近いTopLink構成を使用します。このオプションにより、最も広範なアプリケーションに対してパフォーマンスとスケーラビリティが最大になります。
OC4J EJB 2.1 CMPは、ライフ・サイクル・メソッド・コールに関してオプションCに準拠します。ただし、TopLink永続マネージャには次の新機能が導入されています。
TopLinkペシミスティックまたはオプティミスティック・ロック・ポリシーとともにロックまたは同期を使用して、同じBeanへの同時サービスを処理できます。これにより、インスタンスが失効データで更新されないことを保証したまま、同じインスタンスの同時アクセスのパフォーマンスを最大にすることができます。
ファイングレインなTopLink構成変更の詳細は、次を参照してください。
OC4JにデプロイされたEJB 2.1 BMPアプリケーションの場合は、コミット・オプションAまたはCを構成できます(「Bean管理の永続性を備えたエンティティBeanのコミット・オプションの構成」を参照)。
Bean管理の永続性を備えたエンティティBeanを読取り専用として構成した場合、OC4Jはコミット・オプションAの特殊ケースを使用してパフォーマンスを向上させます。この場合、OC4Jはインスタンスをキャッシュし、トランザクションのコミット時にインスタンスの更新やejbStore
のコールは行いません。詳細は、「Bean管理の永続性を備えた読取り専用エンティティBeanの構成」を参照してください。
BMPコミット・オプションAおよびBean管理の永続性を備えた読取り専用エンティティBeanは個別に使用できます(つまり、読取り専用を使用せずにコミット・オプションAでBean管理の永続性を備えたエンティティBeanを構成でき、またコミット・オプションAでBean管理の永続性を備えたエンティティBeanを構成せずに読取り専用を使用できる)。
EJB 2.1エンティティBeanインスタンスを問い合せるには、finderまたはselectメソッドを使用します(「finderメソッドについて」および「selectメソッドについて」を参照)。
どちらの場合も、適切な問合せ構文を使用して、選択基準を表現します(「EJB 2.1問合せ構文について」を参照)。
詳細は、第16章「EJB 2.1問合せの実装」を参照してください。
表1-16に、EJB問合せの定義に使用できる問合せ構文のタイプをまとめます。
問合せ構文 | 参照先 |
---|---|
EJB QL |
|
TopLink |
|
事前定義のfinder |
|
デフォルトのfinder |
|
カスタムfinder |
|
カスタムselect |
|
ネイティブSQL |
移植と最適化が可能なため、EJB QLの使用をお薦めします。
EJB QLは、移植と最適化が可能な形式でfinderおよびselectメソッド(「finderメソッドについて」および「selectメソッドについて」を参照)のセマンティクスを定義するために使用される指定言語です。EJB QL文は、各finderおよびselectメソッドに関連付けられています。
SQLと似ていますが、EJB QLはネイティブSQLよりもはるかに優れています。SQLでは列名を使用して表に対して問合せを行いますが、EJB QLでは、Beanの抽象スキーマ名およびコンテナ管理の永続性フィールドと関連性フィールドを問合せ内で使用し、コンテナ管理の永続性を備えたエンティティBeanに対して問合せを行います。EJB QL文では、オブジェクト用語を使用します。コンテナは、アプリケーションのデプロイ時に、EJB QL文を適切なデータベースSQL文に変換します。したがって、コンテナは、エンティティBean名、コンテナ管理の永続性フィールド名およびコンテナ管理の関連性フィールド名を、適切なデータベース表名と列名に変換します。EJB QLは、OC4Jでサポートされているすべてのデータベースに移植可能です。
EJB 2.1では、EJB QLはSQL92のサブセットであり、エンティティBeanの抽象スキーマに定義されている関連へのナビゲーションを可能にする拡張機能があります。抽象スキーマは、エンティティBeanのデプロイメント・ディスクリプタの一部で、Beanの永続フィールドと関連を定義します。「抽象」という用語によって、このスキーマは基礎となるデータ・ストアの物理的なスキーマと区別されます。EJB QL問合せの有効範囲には、同じEJB JARファイルにパッケージされている関連のエンティティBeanの抽象スキーマが含まれるため、抽象スキーマ名はEJB QL問合せで参照されます。
コンテナ管理の永続性を使用するエンティティBeanの場合、EJB QL問合せはすべてのfinderメソッド(findByPrimaryKey
を除く)について定義する必要があります。OC4JをTopLink永続性マネージャとともに使用すると、事前定義およびデフォルトのfinderおよびselectメソッドを利用できます(「TopLink finder」および「カスタムTopLink selectメソッド」を参照)。EJB QL問合せによって、finderまたはselectメソッドの起動時にEJBコンテナで実行される問合せが決まります。
Oracle Application Serverでは、EJB QLを次の重要な機能とともにサポートしています。
EJB 2.1を使用した場合、OC4Jは、EJB 2.1で使用できないSQRTと日付、時刻、タイムスタンプの各オプションをサポートするために独自のEJB QL拡張を提供します(「OC4J EJB 2.1 EJB QL拡張」を参照)。
このリリースでは、TopLinkはデフォルトの永続性マネージャ(「TopLink EJB 2.1永続性マネージャ」を参照)であるため、TopLink問合せおよび式フレームワークを使用してEJB 2.1のfinderまたはselectメソッドの選択基準を表現できます。このEJB QLのかわりとなる手段には多数の利点があります(「TopLink問合せおよび式の利点」を参照)。
TopLink Workbenchを使用して、ejb-jar.xml
ファイルをカスタマイズし、TopLink問合せおよび式フレームワークを使用して高度なfinderおよびselectメソッドを作成できます。
TopLink永続性マネージャが提供する事前定義およびデフォルトのfinderおよびselectメソッドを利用することもできます(「TopLink finder」および「カスタムTopLink selectメソッド」を参照)。
詳細は、次を参照してください。
TopLink式フレームワークを使用すると、ドメイン・オブジェクト・モデルに基づいて問合せ検索基準を指定できます。
式には、SQLと比べてデータベースへのアクセス時に次の利点があります。
Query
インタフェースを標準化することにより、式は判読性を向上させます。たとえば、Employee
クラスのAddress
オブジェクトから番地を取得するために必要なJavaコードは次のようになります。
emp.getAddress().getStreet().equals("Meadowlands");
同じ情報を取得するための式も同様です。
emp.get("address").get("street").equal("Meadowlands");
ExpressionBuilder emp = new ExpressionBuilder(); Expression exp = emp.get("address").get("street").equal("Meadowlands"); Vector employees = session.readAllObjects(Employee.class, exp.and(emp.get("salary").greaterThan(10000)));
TopLinkでは、そのコードから適切なSQLが自動的に生成されます。
SELECT t0.VERSION, t0.ADDR_ID, t0.F_NAME, t0.EMP_ID, t0.L_NAME, t0.MANAGER_ID, t0.END_DATE, t0.START_DATE, t0.GENDER, t0.START_TIME, t0.END_TIME,t0.SALARY FROM EMPLOYEE t0, ADDRESS t1 WHERE (((t1.STREET = 'Meadowlands')AND (t0.SALARY > 10000)) AND (t1.ADDRESS_ID = t0.ADDR_ID))
このリリースでは、TopLink永続性マネージャは、指定された問合せ構文を受け取り(「EJB QL問合せ構文について」または「TopLink問合せ構文について」を参照)、基礎となるリレーショナル・データベースに固有のStructured Query Language(SQL)を生成します。
EJB QLは、移植と最適化が可能なため、推奨される構文です。
ネイティブSQLは、EJB QLでサポートされない基礎となるリレーショナル・データベースの高度な問合せ機能を利用する場合に適しています。
EJB 2.1およびTopLink問合せ構文を使用した場合、次のものを使用できます。
ネイティブSQLを使用するには、直接JDBCコールを使用する必要があります。
finderメソッドは、名前がfind
で始まるEJBメソッドであり、EJBのHome
インタフェースで定義し(「EJB 2.1ホーム・インタフェースの実装」を参照)、問合せに関連付けてそのEJBタイプの1つ以上のインスタンスを返します。デプロイ時に、OC4Jは、関連付けられている問合せを実行するこのメソッドの実装を提供します。
finderメソッドは、クライアントがコンテナ管理の永続性を備えたEJB 2.1エンティティBeanを取得する手段です。EJB 2.1を使用して、次の処理を実行できます。
単一のEJBインスタンスを返すfinderの戻り型は、そのEJBインスタンスの型です。
複数のEJBインスタンスを返すfinderの戻り型は、Collection
です。一致する項目が見つからない場合は、空のCollection
が返されます。重複した項目を返さないようにするには、関連付けられているEJB問合せでDISTINCT
キーワードを指定します。
すべてのfinderは、FinderException
をスローします。
最低でも、findByPrimaryKey
finderメソッドを公開して、主キーを使用して各エンティティのBeanの参照を取得する必要があります。
TopLink永続性マネージャは、OC4JエンティティBeanに対して様々な事前定義(「事前定義のTopLink finder」を参照)およびデフォルト(「デフォルトのTopLink finder」を参照)のfinderを提供します。これらのfinderは、他のfinderと同様にクライアントに公開できます。対応する問合せを指定する必要はありません。カスタムTopLink finderも作成できます(「カスタムTopLink finder」を参照)。
表1-17に、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanに対して公開できる事前定義のfinderをリストします。TopLink永続性マネージャは、表1-17にリストされているメソッド名を予約しています。
メソッド | 引数 | 戻り型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
コンポーネント・インタフェース |
|
|
|
|
|
コンポーネント・インタフェース |
|
|
|
|
|
コンポーネント・インタフェース |
|
|
|
1
finderがホーム・インタフェースとコンポーネント・インタフェースのどちらで定義されているかによって決まります。 |
例1-3に、2つの事前定義のfinder(findByPrimaryKey
およびfindManyBySQL
)を定義するEJBHome
を示します。TopLinkは、これらのfinderの問合せ実装を提供します。
public interface EmpBeanHome extends EJBHome {
public EmpBean create(Integer empNo, String empName) throws CreateException;
/**
* Finder methods. These are implemented by the container. You can
* customize the functionality of these methods in the deployment
* descriptor through EJB-QL.
**/
// Predefined Finders: <query> element in ejb-jar.xml not required
public Topic findByPrimaryKey(Integer key) throws FinderException;
public Collection findManyBySQL(String sql, Vector args) throws FinderException
}
名前がfindBy<
CMP-FIELD-NAME
>
(<
CMP-FIELD-NAME
>
はBeanの永続フィールドの名前)と一致するエンティティBeanのホーム・インタフェースで定義されている各finderについて、TopLinkは、TopLink式フレームワークを使用するTopLink問合せ実装などのfinder実装を生成します。戻り型が単一のBean型である場合、TopLinkはoracle.toplink.queryframework.ReadObjectQuery
を作成します。戻り型がCollection
の場合、TopLinkはoracle.toplink.queryframework.ReadAllQuery
を作成します。これらのfinderは、他のfinderと同様にクライアントに公開できます。対応する問合せを指定する必要はありません。
例1-4に、デフォルトのfinder(findByEmpNo
)を定義するEJBHome
を示します。TopLinkは、このfinderの問合せ実装を提供します。
public interface EmpBeanHome extends EJBHome {
public EmpBean create(Integer empNo, String empName) throws CreateException;
/**
* Finder methods. These are implemented by the container. You can
* customize the functionality of these methods in the deployment
* descriptor through EJB-QL.
**/
// Default Finder: <query> element in ejb-jar.xml not required
public Topic findByEmpNo(Integer empNo);
}
TopLink問合せおよび式フレームワークを利用して、Call
、DatabaseQuery
、主キー、Expression
、EJB QL、ネイティブSQL、リダイレクトfinder(任意のヘルパー・クラスの静的メソッドとして定義する実装に実行を委任する)など、高度なfinderを定義できます。
EJB 2.1を使用してカスタムTopLink finderを作成するには、TopLink Workbenchで既存のtoplink-ejb-jar.xml
ファイルを使用します(「TopLink Workbenchの使用方法」を参照)。
エンティティBeanのselectメソッドは、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanインスタンス内で内部的に使用する問合せメソッドです。selectメソッドを抽象エンティティBeanクラス自体の抽象メソッドとして定義し、EJB QL問合せを関連付けます。ホームまたはコンポーネント・インタフェースではクライアントにselectメソッドは公開しません。1つ以上のselectメソッドを定義すること、またはselectメソッドを定義しないことができます。関連付けるEJB QL問合せに基づいてselectメソッドの実装を提供するのはコンテナです。
通常は、ビジネス・メソッド内でselectメソッドをコールして、コンテナ管理の永続性フィールドの値またはコンテナ管理の関連性フィールドのエンティティBean参照を取得します。selectメソッドは、起動側ビジネス・メソッドのトランザクション属性で判断されるトランザクション・コンテキストで実行します。
selectメソッドには次のシグネチャがあります。
public abstract <ReturnType> ejbSelect<METHOD>(...) throws FinderException
public
およびabstract
として宣言する必要があります。
ejbSelect
で始まる必要があります。
javax.ejb.FinderException
をスローする必要があり、他のアプリケーション固有の例外もスローできます。
selectメソッドは、起動されたエンティティBeanインスタンスの識別情報に基づいていませんが、エンティティBeanの主キーを引数として使用できます。これにより、特定のエンティティBeanインスタンスに論理的に範囲設定された問合せが作成されます。
EJB 2.1を使用している場合は、カスタムEJB QL selectメソッド(「EJB 2.1 EJB QL selectメソッドの実装」を参照)を定義でき、カスタムTopLink selectメソッド(「カスタムTopLink selectメソッド」を参照)を定義できます。
selectメソッドの戻り型は、selectが起動されるエンティティBeanのタイプに制限されません。コンテナ管理の永続性またはコンテナ管理の関連性フィールドに対応する任意の型を返すことができます。
selectメソッドは、次の戻り型ルールに準拠している必要があります。
Object
として返される必要があり、プリミティブ型は対応するObject
型でラップされます(たとえば、int
プリミティブ型はInteger
オブジェクトでラップされる)。
複数のオブジェクトが返された場合は、FinderException
が発生します。
オブジェクトが見つからない場合は、FinderException
が発生します。
Collection
として定義する必要があります。ニーズに合せてCollection
型を選択します。たとえば、Collection
には重複が含まれる場合があり、Set
は重複を除外し、SortedSet
は順序付きCollection
を返します。
オブジェクトが見つからない場合は、空のCollection
が返されます。
Collection
を返し、EJB QLのselect文からその型を判断します。
Collection
を返します。その型はローカルBeanインタフェース型です。 これをアノテーション付きリモートBeanインタフェースまたはデプロイXML構成に変更できます。詳細は、「EJB 2.1 EJB QL selectメソッドの実装」を参照してください。
EJB 2.1を使用して、カスタムTopLink selectメソッドを作成できます。
EJB 2.1を使用している場合は、TopLink問合せおよび式フレームワークを利用して、Call
、DatabaseQuery
、Expression
、EJB QL、ネイティブSQLなど、任意のTopLink問合せおよび式フレームワーク機能を利用できる高度なselectメソッドを定義できます。詳細は、「TopLink Workbenchの使用方法」を参照してください。
メッセージドリブンBean(MDB)は、非同期メッセージ・コンシューマとして機能するEJB 3.0またはEJB 2.1 Enterprise Beanコンポーネントです。MDBにはクライアント固有の状態はありませんが、開いたデータベース接続や別のEJBへのオブジェクト参照などのメッセージ処理状態を含むことができます。クライアントは、MDBを使用して、Beanがメッセージ・リスナーとなっている送信先にメッセージを送信します。
OC4Jを使用すると、MDBを様々なメッセージ・プロバイダとともに使用できます(「MDBで使用できるメッセージ・サービス・プロバイダ」を参照)。次のように、MDBを既存のメッセージ・プロバイダに関連付け、必要な設定の多くをコンテナが処理します。
QueueReceiver
またはTopicSubscriber
のコンシューマが作成されます。
QueueReceiver
またはTopicSubscriber
)およびそのファクトリに登録されます。
MDBの目的は、プール内に存在し、メッセージ・プロバイダからの受信メッセージを受け取り、処理することです。コンテナは、キューからBeanを起動して、キューからの受信メッセージを処理します。MDBを直接起動するオブジェクトはありません。MDBの起動は、すべてコンテナから指示されます。いったんコンテナがMDBを起動すると、他のEnterprise BeanまたはJavaオブジェクトを起動して、リクエストを続行することが可能です。
MDBは、対話状態を保存せず、複数の受信リクエストの処理に使用される点において、ステートレス・セッションBeanに似ています。MDBは、クライアントから直接受信したリクエストを処理するのではなく、キューに入れられたリクエストを処理します。図1-7に、このように、クライアントがリクエストをキューに入れる様子を示します。コンテナは、キューからリクエストを取り出し、そのリクエストをプール内のMDBに渡します。
この項の内容は次のとおりです。
詳細は、次を参照してください。
図1-8に、メッセージドリブンBeanのライフ・サイクルを示します。@PostConstruct
などのアノテーションは、EJB 3.0のメッセージドリブンBeanにのみ適用されます。
EJB 3.0(表1-18を参照)とEJB 2.1(表1-19を参照)のメッセージドリブンBeanのライフ・サイクルは同一です。違いは、ライフ・サイクル・コールバック・メソッドの登録方法です。
表1-18に、アノテーションを使用して定義できるEJB 3.0メッセージドリブンBeanのオプションのライフ・サイクル・コールバック・メソッドをリストします。EJB 3.0メッセージドリブンBeanでは、これらのメソッドを実装する必要はありません。
表1-19に、javax.ejb.MessageDrivenBean
インタフェースでの指定に従って、メッセージドリブンBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドをリストします。EJB 2.1メッセージドリブンBeanでは、最低でも、すべてのコールバック・メソッド用に空の実装を用意する必要があります。
EJBメソッド | 説明 |
---|---|
|
コンテナは、Beanの作成直前にこのメソッドを起動します。メッセージドリブンBeanは、このメソッドでは何も行いません。 |
|
コンテナは、MDBを破棄する前にこのメソッドを起動します。このメソッドを使用して、ファイル・ハンドルなどの外部リソースのクローズなど、必要なクリーンアップを実行します。 |
詳細は、次を参照してください。
OC4Jは、メッセージドリブンBeanインスタンスのjavax.ejb.MessageDrivenContext
を維持し、このメッセージドリブン・コンテキストをBeanに対して使用可能にします。Beanは、メッセージドリブン・コンテキスト内のメソッドを使用して、コンテナへのコールバック・リクエストを送信できます。
また、EJBContext
から継承されたメソッドを使用できます(「EJBコンテキストとは」を参照)。
詳細は、次を参照してください。
この項の内容は次のとおりです。
ステートレス・セッションBeanは、主に、頻繁な短いリクエストを処理するためのBeanのプールを持つ中間層アプリケーション・サーバーに使用されます。
表1-20で、具体的に、BMPとCMP両方の定義、およびそれらのプログラム面での違いと宣言の違いを示します。
CMPでは、独自の低レベルJDBCベースの永続性システムを作成しなくても、Java EEでサポートされるアプリケーション・サーバーおよびデータベースにEJBの状態を保存できるEJB 2.0仕様にコンポーネントを構築できます。
BMPでは、追加のコーディングやサポート作業を負担することでアプリケーションの永続性レイヤーを調整できます。
詳細は、次を参照してください。
OC4J、TopLink EJB 3.0 JPA永続性プロバイダおよびEJB 2.1永続性マネージャは、トランザクション分離(「トランザクション分離」を参照)と同時実行性モード(「同時実行性(ロック)モード」を参照)の組合せを使用して、データベース・リソースの競合を回避し、データベース表への同時アクセスを許可します。
同じデータに対する同時(パラレル)トランザクションが対話を許可される程度は、構成されているトランザクション分離のレベルによって決まります。ANSI/SQLは、表1-21に示すように、データベース・トランザクション分離の4つのレベルを定義します。各レベルには、パフォーマンスと次のような望ましくないアクションの防止との間にトレードオフがあります。
トランザクション分離レベル | 内容を保証しない読取り | 非リピータブル・リード | 仮読取り |
---|---|---|---|
未コミット・データの読取り |
○ |
○ |
○ |
コミット・データの読取り |
× |
○ |
○ |
リピータブル・リード |
× |
× |
○ |
シリアライズ可能 |
× |
× |
× |
デフォルトでは、OC4J、TopLink EJB 3.0 JPA永続性プロバイダおよびEJB 2.1永続性マネージャは、コミット読取りトランザクション分離を提供します。
トランザクション分離モードを構成するには、TopLink EJB 3.0 JPA永続性プロバイダまたはEJB 2.1永続性マネージャをカスタマイズする必要があります。
詳細は、次を参照してください。
OC4Jでは、EJB 3.0エンティティおよびコンテナ管理の永続性を備えたEJB 2.1エンティティBean内でのリソースの競合およびパラレル実行を処理するため、同時実行性モードも提供されます。
Bean管理の永続性を備えたエンティティBeanは、Bean実装自体内でリソースのロックを管理します。
同時実行性モードには、次のものが含まれます。
オプティミスティック・ロックが有効化されると、TopLinkは、データソースからオブジェクトを読み取る際にこのバージョン・フィールドの値をキャッシュします。クライアントがオブジェクトの書込みを試行すると、TopLinkにより、キャッシュされたバージョン値がデータソース内の現在のバージョン値と次の方法で比較されます。
これらの同時実行性モードはBeanごとに定義され、トランザクション境界に適用されます。
EJB 3.0のデフォルトでは、JPA永続性マネージャにより、データ整合性の確保はアプリケーションの役割であるとみなされます。@Version
アノテーションを使用してバージョン・フィールドを指定し、JPA管理のオプティミスティック・ロックを有効化することをお薦めします。
EJB 2.1のデフォルトでは、TopLink永続性マネージャは、オブジェクト変更がコミットされるたびにTopLinkにより更新されるコード生成の数値バージョン・フィールドを使用してオプティミスティック・ロックを実行します。
別の方法で同時実行性モードを構成するには、TopLink EJB 3.0 JPA永続性プロバイダまたはEJB 2.1永続性マネージャをカスタマイズする必要があります。
詳細は、次を参照してください。
|
![]() Copyright © 2002, 2008 Oracle Corporation. All Rights Reserved. |
|