容器管理的持久 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>Card</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 存根之前,需要执行这些步骤。 以下示例概括了可能的迁移路径。
ejbCreate 和 ejbPostCreate 方法。ejbCreate 和 ejbPostCreate 方法的 EJB 的正确字段中设置序号。create 方法。create() 方法来传递下一个序号的代码。以下高级示例显示了如何替换 Oracle 自动生成键逻辑的功能。 您将需要为每个使用 Oracle 自动生成序号的 CMP 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); ... } |
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; |
|
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"); } |
create() 方法来传递下一个序号的代码。| Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate); |