容器管理的持久 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_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 Home 的
create 方法。
- 添加逻辑以获取 CMP 实体 Bean 的下一个序号。
- 修改用于调用 EJB Home
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 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");
}