儲存器管理的持續性 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_name 是 sequence_id,則可以使用下列 SQL 陳述式來取得下一個序號。
select sequence_id.NEXTVAL from dual;
如果此規則標示了 weblogic-cmp-rdbms-jar.xml 部署描述子中的項目,您需要採取步驟,手動修改 EJB 程式碼,以建立索引鍵。 在針對 WebSphere Application Server 重新產生 EJB Stub 之前,必須先採取這些步驟。
下列範例概述可能的移轉路徑。
- 將序號的參數新增至 Entity Bean 的
ejbCreate 和 ejbPostCreate 方法。
- 在
ejbCreate 和 ejbPostCreate 方法的 EJB 適當欄位中設定序號。
- 將序號的參數新增至 EJB Home 的
create 方法。
- 新增邏輯,以取得 CMP Entity Bean 的下一個序號。
- 修改會呼叫 EJB Home
create() 方法來傳遞下一個序號的程式碼。
下列的高階範例顯示如何取代 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");
}