Détecter les règles générées automatiquement par Oracle

Les descripteurs de déploiement WebLogic pour les beans permanents gérés par conteneur permettent aux applications d'utiliser une fonction de génération automatique de séquence de base de données (clé). Lorsqu'elle utilise cette fonction, une application WebLogic n'a pas besoin d'ajouter du code pour générer la clé de séquence suivante lors de la création d'objets EJB CMP. Lors de la migration d'applications WebLogic qui incluent une génération automatique de séquence, du code d'application doit être ajouté pour générer l'identificateur de séquence des nouvelles entrées.

Le fichier weblogic-cmp-rdbms-jar.xml contient des informations pour les beans entity EJB qui utilisent la persistance basée sur un système de gestion de base de données relationnelle WebLogic. Cette règle analyse la configuration des éléments automatic-key-generation WebLogic et fournit des informations de migration pour le type de générateur Oracle. Cet exemple montre un élément qui sera marqué par cette règle :

< bean_rdbms-weblogic-weblog>
<ejb-name>Carte</ejb-name>
<data-source-name>MyDataSource</data-source-name>
<table-name>MY_TABLE</table-name>
...
< span class= "indent2"> < /span> < automatic-key-generation>
<generator-type>Oracle</generator-type>
<generator-name>id_séquence</generator-name>
<key-cache-size>10</key-cache-size>
</automatic-key-generation>
...
</weblogic-rdbms-bean>

L'entrée generator-name indique le nom de la table DUAL Oracle à utiliser pour générer la séquence suivante. Par exemple, si generator_name a pour valeur sequence_id, l'instruction SQL indiquée ci-après peut être utilisée pour obtenir le numéro de séquence suivant.

select sequence_id.NEXTVAL from dual;

Si cette règle marque des entrées dans votre descripteur de déploiement weblogic-cmp-rdbms-jar.xml, vous devrez modifier manuellement votre code EJB pour créer des clés. Ces modifications doivent être effectuées avant la régénération des modules de remplacement EJB pour WebSphere Application Server. Un chemin de migration possible est illustré dans les exemples ci-après.

Les exemples détaillés ci-après montrent comment remplacer la fonctionnalité de la logique de clé générée automatiquement par Oracle. Vous devrez écrire un code similaire pour chaque bean de la persistance gérée par conteneur qui utilise des numéros de séquence générés automatiquement par Oracle. Vous pouvez créer des classes d'aide d'utilitaire pour combiner une logique commune qui génère les numéros de séquence pour chaque bean.

Ajoutez un paramètre pour le numéro de séquence dans les méthodes ejbCreate et ejbPostCreate du bean entity.

Avant :

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

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

Définissez le numéro de séquence dans la zone appropriée de l'EJB dans la méthode ejbCreate.

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

Ajoutez un paramètre pour le numéro de séquence dans la méthode create de l'objet home EJB.

Avant :

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

Après :

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

Ajoutez une logique afin d'obtenir le numéro de séquence suivant pour le bean entity 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");
}

Modifiez le code où la méthode create() de l'objet home EJB est appelée pour transmettre le numéro de séquence suivant.

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