偵測 Oracle 自動產生的索引鍵

儲存器管理的持續性 Bean 的 WebLogic 部署描述子容許應用程式使用自動產生資料庫序列(索引鍵)特性。 如果使用這項特性,當建立 CMP EJB 物件時,WebLogic 應用程式不需要包含用來產生下一個序列索引鍵的程式碼。 當移轉含有自動產生序列的 WebLogic 應用程式時,必須新增應用程式碼,以便為新項目產生序列 ID。

weblogic-cmp-rdbms-jar.xml 檔含有使用 WebLogic RDBMS 型持續性的 Entity EJB 資訊。 此規則會掃描 WebLogic automatic-key-generation 元素的配置,並提供 Oracle 產生器類型的移轉資訊。 下列範例顯示將被此規則標示的元素:

<weblogic-rdbms-bean>
<ejb-name>卡片</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 Stub 之前,必須先採取這些步驟。 下列範例概述可能的移轉路徑。

下列的高階範例顯示如何取代 Oracle 自動產生的索引鍵邏輯的功能。 您需要針對使用 Oracle 自動產生的序號的每一個 CMP Bean,撰寫類似的程式碼。 您可以建立公用程式說明類別,來合併產生每一個 Bean 之序號的一般邏輯。

將序號的參數新增至 Entity 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 Home 的 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 Entity 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");
}

修改會呼叫 EJB Home create() 方法來傳遞下一個序號的程式碼。

Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate);