Detectar chaves geradas automaticamente da Oracle

Os descritores de implementação WebLogic para beans persistentes gerenciados pelo contêiner permitem que os aplicativos usem um recurso para geração de sequência automática de banco de dados (chave). Ao usar esse recurso, um aplicativo WebLogic não precisa incluir código para gerar a próxima chave de sequência ao criar objetos CMP EJB. Ao migrar aplicativos WebLogic que incluem geração de sequência automática, o código do aplicativo deverá ser incluído para gerar o identificador de sequência para novas entradas.

O arquivo weblogic-cmp-rdbms-jar.xml contém informações para EJBs da entidade que usam persistência baseada em WebLogic RDBMS. Essa regra faz a varredura para encontrar configuração do elemento automatic-key-generation do WebLogic e fornece informações de migração para o tipo gerador da Oracle. Esse exemplo mostra um elemento que será sinalizado por esta regra:

< weblogic-rdbms-bean>
<ejb-name>Cartão</ejb-name>
<data-source-name>MyDataOrigem</data-source-name>
<table-name>MY_TABLE</table-name>
...
< span class= "indent2"> < /span> < 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>

A entrada generator-name indica o nome da tabela DUAL da Oracle a ser usada para gerar a próxima sequência. Por exemplo, especificado um generator_name de sequence_id, a próxima instrução SQL poderá ser usada para obter o próximo número de sequência.

select sequence_id.NEXTVAL from dual;

Se essa regra sinalizar entradas em seu descritor de implementação weblogic-cmp-rdbms-jar.xml, você precisará executar etapas para modificar manualmente seu código EJB para criar chaves. Essas etapas precisam ser executadas antes da nova geração de seus stubs EJB para WebSphere Application Server. Os exemplos a seguir esboçam um caminho de migração potencial.

Os exemplos de alto nível a seguir mostram como substituir a funcionalidade da lógica de chaves gerada automaticamente pela Oracle. É necessário gravar um código semelhante para cada bean CMP que usa os números de sequência gerados automaticamente pela Oracle. É possível criar classes de ajuda do utilitário para combinar lógica comum que gera os números de sequência para cada bean.

Incluir um parâmetro para o número de sequência nos métodos ejbCreate e ejbPostCreate do bean de entidade.

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

Depois:

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

Configure o número de sequência no campo adequado do EJB no método ejbCreate.

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

Incluir um parâmetro para o número de sequência para o método create do EJB Home.

Antes:

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

Depois:

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

Incluir lógica para obter o próximo número de sequência para o bean de entidade 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");
}

Modificar o código em que o método create() do EJB home é chamado para passar o próximo número de sequência.

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