コンテナー管理パーシスタント Bean の WebLogic デプロイメント記述子では、自動データベース・シーケンス (キー) 生成用のフィーチャーをアプリケーションが使用することが許されています。 このフィーチャーを使用すると、CMP EJB オブジェクトの作成時に次のシーケンス・キーを生成するコードを WebLogic アプリケーションに組み込む必要がありません。 自動シーケンス生成を含む WebLogic アプリケーションをマイグレーションする場合には、新規エントリーのシーケンス ID を生成するアプリケーション・コードを追加する必要があります。
weblogic-cmp-rdbms-jar.xml ファイルには、WebLogic RDBMS ベースのパーシスタンスを使用する
エンティティー EJB の情報が含まれています。
この規則は、WebLogic automatic-key-generation エレメントの構成をスキャンして、
ジェネレーター・タイプ Oracle のマイグレーション情報を提供します。
次の例では、この規則でフラグが立てられるエレメントを示しています。
|
<weblogic-rdbms-bean> <ejb-name>Card</ejb-name> <data-source-name>MyDataSource</data-source-name> <table-name>MY_TABLE</table-name> ... <automatic-key-generation> <generator-type>Oracle</generator-type> <generator-name>sequence_id</generator-name> <key-cache-size>10</key-cache-size> </automatic-key-generation> ... </weblogic-rdbms-bean> |
generator-name のエントリーは、次のシーケンスの生成に使用する、Oracle 表 DUAL 内の名前を示します。
例えば、generator_name が sequence_id の場合、
以下の SQL ステートメントを使用して、次のシーケンス番号を取得できます。
| select sequence_id.NEXTVAL from dual; |
weblogic-cmp-rdbms-jar.xml デプロイメント記述子のエントリーにこの規則でフラグが立てられた場合には、 キーを作成するように EJB コードを手動で変更する処理を行う必要があります。 この処理は、WebSphere Application Server の EJB スタブを再生成する前に行ってください。 以下の例で、実行する可能性のあるマイグレーション手順を概説します。
ejbCreate メソッドと ejbPostCreate メソッドに、シーケンス番号のパラメーターを追加します。ejbCreate メソッドと ejbPostCreate メソッドで、EJB の適切なフィールドにシーケンス番号を設定します。create メソッドに、シーケンス番号のパラメーターを追加します。create() メソッドを呼び出すコードを変更して、次のシーケンス番号を渡すようにします。以下の概要レベルの例で、Oracle 自動生成キーのロジックの機能を置き換える方法を示します。 Oracle 自動生成シーケンス番号を使用する CMP Bean ごとに、同様のコードを作成する必要があります。 ユーティリティー・ヘルプ・クラスを作成して、各 Bean のシーケンス番号を生成する共通ロジックを結合することができます。
ejbCreate メソッドと ejbPostCreate メソッドに、シーケンス番号のパラメーターを追加します。変更前:
|
public Integer ejbCreate(String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException ... public Integer postCreate(String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException ... |
変更後:
|
public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException ... public Integer postCreate(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException ... |
ejbCreate メソッドで、EJB の適切なフィールドにシーケンス番号を設定します。|
public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException { ... setCardID(sequenceID); ... } |
create メソッドに、シーケンス番号のパラメーターを追加します。変更前:
|
public Card create(String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException; |
変更後:
|
public Card create(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException; |
|
String sqlQuery = "select sequence_id.NEXTVAL from dual"; PreparedStatement prepStmt = con.prepareStatement(sqlQuery); ResultSet rs = prepStmt.executeQuery(); if(rs != null) { rs.next(); nextKey = rs.getInt("NEXTVAL"); } |
create() メソッドを呼び出すコードを変更して、次のシーケンス番号を渡すようにします。| Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate); |