Detectar claves Oracle generadas automáticamente

Los descriptores de despliegue de WebLogic para beans persistentes gestionados por contenedor permiten que las aplicaciones utilicen la función de generación automática de claves de secuencia de base de datos. Cuando se utiliza esta función, una aplicación WebLogic no necesita incluir código para generar la clave de secuencia siguiente al crear objetos EJB de CMP. Cuando se migran aplicaciones WebLogic que incluyen generación automática de secuencia, se debe añadir código de aplicación para crear el identificador de secuencia para entradas nuevas.

El archivo weblogic-cmp-rdbms-jar.xml contiene información para los EJB de entidad que utilizan la persistencia basada en RDBMS de WebLogic. Esta regla busca la configuración de los elementos automatic-key-generation de WebLogic y proporciona información de migración para el tipo de generador Oracle. Este ejemplo muestra un elemento que será marcado por la regla:

< weblogic-rdbms-bean>
<ejb-name>Tarjeta</ejb-name>
<data-source-name>MyDataOrigen</data-source-name>
<table-name>MI_TABLA</table-name>
...
< span class= "indent2"> < /span> < generación-clave-automático>
<generator-type>Oracle</generator-type>
<generator-name>id_secuencia</generator-name>
<key-cache-size>10</key-cache-size>
</automatic-key-generation>
...
</weblogic-rdbms-bean>

La entrada generator-name indica el nombre de la tabla DUAL de Oracle que se utilizará para crear la secuencia siguiente. Por ejemplo, para un generator_name de sequence_id, se puede utilizar la sentencia de SQL siguiente para obtener el número de secuencia siguiente.

select sequence_id.NEXTVAL from dual;

Si esta regla marca entradas en el descriptor de despliegue de weblogic-cmp-rdbms-jar.xml, debe modificar manualmente el código de EJB para crear claves. Esta modificación se debe hacer antes de volver a crear los apéndices de EJB para WebSphere Application Server. Los ejemplos siguientes describen una vía de migración posible:

Los ejemplos generales siguientes muestran cómo sustituir la funcionalidad del código para claves generadas automáticamente de Oracle. Debe escribir código similar para cada bean CMP que utilice números de secuencia creados automáticamente de Oracle. Puede crear clases auxiliares de uso general para combinar lógica común que genera los números de secuencia para cada bean.

Añada un parámetro para el número de secuencia a los métodos ejbCreate y ejbPostCreate del bean de entidad.

Antes:

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
...

Después:

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
...

Defina el número de secuencia en el campo adecuado del EJB en el método ejbCreate

public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
{
...
setCardID(sequenceID);
...
}

Añada un parámetro para el número de secuencia al método create del objeto EJB Home.

Antes:

public Card create(String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException;

Después:

public Card create(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException;

Añada código para obtener el número de secuencia siguiente del bean de entidad de CMP.

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

Modifique el código donde se invoca el método create() de EJB Home para pasar el número de secuencia siguiente.

Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate);