检测 Oracle 自动生成的密钥

容器管理的持久 Bean 的 WebLogic 部署描述符支持应用程序使用特定功能部件自动生成数据库序列(键)。 使用此功能部件时,WebLogic 应用程序不必包含创建 CMP EJB 对象时用来生成下一个序列键的代码。 迁移包含自动生成序列功能部件的 WebLogic 应用程序时,必须添加应用程序代码才能为新条目生成序列标识。

weblogic-cmp-rdbms-jar.xml 文件包含实体 EJB 的信息,这些 EJB 使用基于 WebLogic RDBMS 的持久性。 此规则会扫描 WebLogic automatic-key-generation 元素的配置,并为 Oracle 生成器类型提供迁移信息。 本示例会显示将由此规则进行标记的元素:

<weblogic-rdbms-bean>
<ejb-name>卡</ejb-name>
<data-source-name>MyData源</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_namesequence_id,可以使用以下 SQL 语句来获取下一个序号。

select sequence_id.NEXTVAL from dual;

如果此规则会标记 weblogic-cmp-rdbms-jar.xml 部署描述符中的条目,那么您将需要执行步骤来手动修改 EJB 代码以创建键。 为 WebSphere Application Server 重新生成 EJB 存根之前,需要执行这些步骤。 以下示例概括了可能的迁移路径。

以下高级示例显示了如何替换 Oracle 自动生成键逻辑的功能。 您将需要为每个使用 Oracle 自动生成序号的 CMP Bean 编写类似的代码。 您可以创建实用程序帮助类,以合并针对每个 Bean 生成序号的公共逻辑。

将序号的参数添加至实体 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 实体 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);