コンテナー管理パーシスタント 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>カード</ejb-name>
<data-source-name>MyDataソース</data-source-name>
<table-name>MY_TABLE (MY_TABLE)</table-name>
...
< span class= "indent2"> < /span> < 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 スタブを再生成する前に行ってください。
以下の例で、実行する可能性のあるマイグレーション手順を概説します。
- エンティティー Bean の
ejbCreate メソッドと ejbPostCreate メソッドに、シーケンス番号のパラメーターを追加します。
ejbCreate メソッドと ejbPostCreate メソッドで、EJB の適切なフィールドにシーケンス番号を設定します。
- EJB ホームの
create メソッドに、シーケンス番号のパラメーターを追加します。
- CMP エンティティー Bean の次のシーケンス番号を取得するロジックを追加します。
- EJB ホームの
create() メソッドを呼び出すコードを変更して、次のシーケンス番号を渡すようにします。
以下の概要レベルの例で、Oracle 自動生成キーのロジックの機能を置き換える方法を示します。
Oracle 自動生成シーケンス番号を使用する CMP Bean ごとに、同様のコードを作成する必要があります。
ユーティリティー・ヘルプ・クラスを作成して、各 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);
...
}
EJB ホームの 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;
CMP エンティティー Bean の次のシーケンス番号を取得するロジックを追加します。
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");
}