偵測 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>MyData來源</data-source-name>
<table-name>表格</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_namesequence_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 的 ejbCreateejbPostCreate 方法。

之前:

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);