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>Card</ejb-name> <data-source-name>MyDataSource</data-source-name> <table-name>MY_TABLE</table-name> ... <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> |
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.
ejbCreate und ejbPostCreate der Entity-Bean einen Parameter hinzu.ejbCreate und ejbPostCreate fest.create von EJB-Home einen Parameter hinzu.create() aufgerufen wird, um die nächste Folgenummer zu übergeben.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.
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 ... |
ejbCreate fest.|
public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException { ... setCardID(sequenceID); ... } |
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; |
|
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"); } |
create() aufgerufen wird, um die nächste Folgenummer zu übergeben.| Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate); |