Rileva chiavi Oracle generate automaticamente

I descrittori di distribuzione WebLogic per i bean CMP (container managed persistent) consentono alle applicazioni di utilizzare una funzione per la generazione di una sequenza database (chiave) automatica. Quando si utilizza questa funzione, un'applicazione WebLogic non deve includere il codice per la generazione della chiave della sequenza successiva durante la creazione di oggetti EJB CMP. Durante la migrazione di applicazioni WebLogic che includono la generazione della sequenza automatica, è necessario aggiungere il codice dell'applicazione per generare l'identificativo della sequenza per le nuove voci.

Il file weblogic-cmp-rdbms-jar.xml contiene informazioni per gli EJB di entità che utilizzano la persistenza basata su RDBMS WebLogic. Questa regola esegue la scansione della configurazione degli elementi WebLogic automatic-key-generation e fornisce informazioni sulla migrazione per il tipo di generatore Oracle. Questo esempio mostra un elemento che verrà contrassegnato da questa regola:

< nome - rdbms - weblog>
<ejb-name>Scheda</ejb-name>
<data-source-name>OrigineMyData</data-source-name>
<table-name>TABELLA_01</table-name>
...
< span class= "indent2"> < /span> < generazione - chiave - automatica>
<generator-type>Oracle</generator-type>
<generator-name>ID_sequenza</generator-name>
<key-cache-size>10</key-cache-size>
</automatic-key-generation>
...
</weblogic-rdbms-bean>

La voce generator-name indica il nome nella tabella DUAL Oracle da utilizzare per generare la sequenza successiva. Ad esempio, dato un generator_name sequence_id, è possibile utilizzare la seguente istruzione SQL per ottenere il numero di sequenza successivo.

select sequence_id.NEXTVAL from dual;

Se questa regola contrassegna le voci nel descrittore di distribuzione weblogic-cmp-rdbms-jar.xml, è necessario eseguire alcune operazioni per modificare manualmente il codice EJB per creare le chiavi. È necessario eseguire tali operazioni prima della rigenerazione degli stub EJB per WebSphere Application Server. Gli esempi riportati di seguito indicano un potenziale percorso di migrazione.

I seguenti esempi di alto livello mostrano come sostituire la funzionalità della logica della chiave generata automaticamente di Oracle. Sarà necessario scrivere codice simile per ciascun bean CMP che utilizza numeri di sequenza generati automaticamente di Oracle. È possibile creare classi utility help per combinare la logica comune che genera i numeri di sequenza per ciascun bean.

Aggiungere un parametro per il numero di sequenza ai metodi ejbCreate e ejbPostCreate del bean di entità.

Prima:

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

Dopo:

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

Impostare il numero di sequenza nel campo corretto dell'EJB nel metodo ejbCreate.

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

Aggiungere un parametro per il numero di sequenza al metodo create di Home EJB.

Prima:

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

Dopo:

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

Aggiungere la logica per acquisire il numero di sequenza successivo per il bean di entità 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");
}

Modificare il codice in cui viene richiamato il metodo create() di home EJB per passare il numero di sequenza successivo.

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