8. EJBコンテナ

EJBコンテナの注意・制限事項について説明します。

8.1. 注意事項

8.1.1. EJBクライアントアプリケーションのコンパイル・実行について

クライアントアプリケーションのコンパイルおよび、実行時には、WebOTXサーバ製品または「WebOTX Client」をインストールする必要があります。 必要なクラスパスやJava起動時のシステムプロパティの設定に関しての詳細は、[ アプリケーション開発ガイド(Java EE) > 4. アプリケーションクライアントの開発 > 4.2.2.1. クラスパスの設定 ]を参照してください。

また、Java EE仕様に則ったEJBのクライアントアプリケーションJarを実行するためのコマンドとして、appclientコマンドが準備されています。詳細は[ システム設計ガイド > 4. EJBアプリケーション > 4.3. アプリケーションクライアント ] を参照してください。

8.1.2. サーバとクライアントのJava VMのバージョン

EJBを配備するサーバとEJBクライアントで使用するJava VMのバージョンは、マイナーバージョンレベルまで一致させる必要があります。

8.1.3. タイマーBeanの使用について

EJB 2.1仕様で追加されたタイマーBeanの機能はデータベースを使用するため、デフォルトでは使用できません。

[ リファレンス集 運用管理・設定編 > 1. コンフィグレーション(設定一覧) > 1.5. EJBコンテナ > 1.5.3. タイマBeanの使用方法について ] を参照してデータソースとデータベースのテーブル追加を行なってください。

8.1.4. JavaのDate型かTime型をフィールドに持つCMPについて

CMPフィールドがJavaのDate型かTime型(java.util.Date, java.sql.Date,java.sql.Time, java.sql.Timestamp)である場合、フィールドの値がデータベースの値と完全には一致しなくなることがあります。

例えば、以下のコードは主キーフィールドとしてjava.sql.Date型を使います。

java.sql.Date myDate = new java.sql.Date(System.currentTimeMillis())beanHome.create(myDate, ...);

データベースによっては、このコードはデータベースにフィールドの値の年、月、および日付の部分だけを保存します。以下のようにクライアントがこのBeanを主キーによって見つけようとすると

myBean = beanHome.findByPrimaryKey(myDate);

そのBeanはデータベース中から見つけることはできません。値がデータベースに保存された値と一致しないからです。

保存している間に、データベースがタイムスタンプ値を切り捨てるか、またはカスタムクエリにwhere節において日付か時間値の比較がある場合、同様の問題が起こる可能性があります。

自動マッピングとオラクルデータベースを使用すると、タイプjava.util.Date、java.sql.Date、java.sql.Time、およびjava.sql.TimestampのすべてのフィールドがオラクルのDATEデータ型にマッピングされます。

8.2. 制限事項

8.2.1. 複数のエンドポイントを持つEJBのアーカイブについて

STDENT
Standard/Enterpriseにおいて、WebOTX DeveloperでWebサービスエンドポイント複数含むEJBをひとつのアーカイブで作成し、配備した場合、そのうちのひとつしか呼び出すことができません。別アーカイブに分けてアプリケーションを作成するようにしてください。

8.2.2. EJBコンストラクタから"java:comp/env"コンテキストへのJNDIアクセスについて

EJB仕様では、Enterprise Beanのコンストラクタで"java:comp/env"コンテキストへのJNDIアクセスを許可していませんが、WebOTXのEJBコンテナではJNDIアクセスが可能になっています。

8.2.3. 名前サーバに登録されたUserTransactionオブジェクト参照の取得について

EJB仕様では、コンテナ管理によるトランザクション設定を持つEnterprise Beanが、名前サーバに登録されたUserTransactionオブジェクト参照をlookup()メソッド使用して取得することを許可していませんが、WebOTXではlookup()メソッドによるアクセスが可能になっています。

8.2.4. remove()メソッド実行後のステートレスSession Beanの呼び出しについて

ステートレスSession Beanがremove()メソッドを呼び出した後に、Beanのメソッドを呼び出しても例外が発生しません。

8.2.5. ステートフルSession BeanのEJBContextクラスのメソッド呼び出しについて

ステートフルSession Beanで、ejbActivate()とejbPassivate()メソッド内から、EJBContextクラスのisCallerInRole()とgetCallerPrincipal()メソッドを呼び出すことはできません。

8.2.6. javax.naming.InitialContextオブジェクトの呼び出し可能メソッドについて

EJB仕様では、Enterprise Bean内部でjavax.naming.InitialContextオブジェクトを取得したとき、そのオブジェクトのlookup()メソッドのみを呼び出し可能としていますが、WebOTXのEJBコンテナではそのオブジェクトのlookup()メソッド以外も呼び出し可能になっています。

8.2.7. remove()メソッド実行後のステートレスSession Beanの呼び出しについて

ステートフルSession Beanで、ejbActivate()とejbPassivate()メソッド内から、EJBContextクラスのisCallerInRole()とgetCallerPrincipal()メソッドを呼び出すことはできません。

8.2.8. CMPナビゲーションをwhere節に含むEJB QLついて

EJB QLのwhere 節に OR 演算子と単一値の CMPナビゲーションが含まれる場合、クエリの検索結果が実際の検索結果よりも不足する場合があります。

この場合は、OR演算子で結合されている演算を別々のEJB QLとして定義し、別々に検索を行って結果をマージするようにEJBの処理を修正してください。

8.2.9. RMI-IIOPのダイナミック・プロキシ使用時の制限事項

Ver6.3よりEJBの通信プロトコルであるRMI-IIOP通信モードに関して、ダイナミック・プロキシを使用するモードが追加されました。配備オプションでダイナミック・プロキシを使用するかどうかを指定できますが、既定値ではダイナミック・プロキシで動作します。ダイナミック・プロキシを使用してEJB間の呼び出しを行う場合、いくつか制限事項があります。詳しくは[ 12. Object Broker JavaTM/C++ > 12.2. 制限事項(Java) > 12.2.1. RMI-IIOP のダイナミック・プロキシによる通信モード使用時の制限事項 ] を参照してください。