Automatisch generierte Oracle-Schlüssel ermitteln

Der WebLogic-Implementierungsdeskriptor für CMP-Beans (Container-managed Persistence) ermöglicht Anwendungen die Verwendung eines Features für die automatische Generierung von Datenbankfolgen (Schlüssel). Bei der Verwendung dieses Features muss eine WebLogic-Anwendung keinen Code für die Generierung des nächsten Folgeschlüssels bei der Erstellung von CMP-EJB-Objekten enthalten. Bei der Migration von WebLogic-Anwendungen, die eine automatische Folgengenerierung enthalten, muss der Anwendungscode für die Generierung der Folgenkennung für neue Einträge hinzugefügt werden.

Die Datei weblogic-cmp-rdbms-jar.xml enthält Informationen für Entity-EJBs, die eine auf dem Managementsystem für relationale Datenbanken von WebLogic basierende Persistenz verwenden. Diese Regeln sucht nach der Konfiguration für das WebLogic-Element automatic-key-generation und stellt Migrationsinformationen für den Generatortyp Oracle bereit. In diesem Beispiel sehen Sie ein Element, das von dieser Regel markiert wird:

< weblogic-rdbms-bean>
<ejb-name>Karte</ejb-name>
<data-source-name>MyDataQuelle</data-source-name>
<table-name>MEINE_TABELLE</table-name>
...
< span class= "indent2"> < /span> < automatische Schlüsselgenerierung>
<generator-type>Oracle</generator-type>
<generator-name>sequenz-id</generator-name>
<key-cache-size>10</key-cache-size>
</automatic-key-generation>
...
</weblogic-rdbms-bean>

Der Eintrag generator-name gibt den Namen aus der Oracle-DUAL-Tabelle an, der für die Generierung der nächsten Sequenz verwendet werden soll. Mit einem generator_name (Generatornamen) der sequence_id (Folgenkennung) beispielsweise kann die folgende SQL-Anweisung verwendet werden, um die nächste Folgenummer abzurufen.

select sequence_id.NEXTVAL from dual;

Wenn diese Regel Einträge in Ihrem Implementierungsdeskriptor weblogic-cmp-rdbms-jar.xml markiert, müssen Sie Ihren EJB-Code manuell ändern, um Schlüssel zu erstellen. Dies müssen Sie vor der neuen Generierung Ihrer EJB-Stubs für WebSphere Application Server tun. In den folgenden Beispielen ist ein potenzieller Migrationspfad beschrieben.

Die folgenden allgemeinen Beispiele veranschaulichen, wie Sie die Funktionalität der Logik der automatisch generierten Oracle-Schlüssel ersetzen können. Sie müssen für jede CMP-Bean, die automatisch generierte Oracle-Folgenummern verwendet, einen ähnlichen Code schreiben. Sie können Dienstprogrammhilfsklassen erstellen, um die allgemeine Logik, die die Folgenummer für jede Bean generiert, zu kombinieren.

Fügen Sie für die Folgenummer den Methoden ejbCreate und ejbPostCreate der Entity-Bean einen Parameter hinzu.

Vorher:

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

Nachher:

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

Legen Sie die Folgenummer im richtigen Feld der EJB in der Methode ejbCreate fest.

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

Fügen Sie für die Folgenummer der Methode create von EJB-Home einen Parameter hinzu.

Vorher:

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

Nachher:

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

Fügen Sie Logik hinzu, um die nächste Folgenummer für die CMP-Entity-Bean abzurufen.

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

Ändern Sie den Code an der Stelle, an der die EJB-Home-Methode create() aufgerufen wird, um die nächste Folgenummer zu übergeben.

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