Файлы описания WebLogic для EJB с поддержкой хранения, управляемого контейнером (CMP), позволяют приложениям использовать функцию для автоматической генерации порядкового номера (ключа) базы данных. В случае использования этой функции приложению WebLogic не нужно содержать код генерации следующего по порядку ключа при создании объектов EJB CMP. В процессе миграции приложений WebLogic, использующих автоматическую генерацию порядковых номеров, в приложения необходимо добавить код генерации порядкового идентификатора для новых записей.
Файл weblogic-cmp-rdbms-jar.xml содержит
информацию для сущностных EJB, использующих хранение под управлением
реляционной СУБД WebLogic.
Это правило проверяет конфигурацию элементов
automatic-key-generation WebLogic и предоставляет информацию о
миграции в зависимости от типа генератора Oracle.
Ниже приведен пример элемента, который будет отмечен данным правилом:
|
<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> |
Запись generator-name содержит имя из таблицы DUAL Oracle, используемое для генерации следующего порядкового номера.
Например, если generator_name равно sequence_id, то для
получения следующего порядкового номера можно использовать следующий оператор
SQL.
| select sequence_id.NEXTVAL from dual; |
Если правило отметит записи в файле описания weblogic-cmp-rdbms-jar.xml, то потребуется выполнить ряд действий вручную для изменения кода EJB так, чтобы он создавал ключи. Эти действия необходимо выполнить перед перегенерацией заглушек EJB для WebSphere Application Server. В следующем примере описан один из возможных способов миграции.
ejbCreate и ejbPostCreate сущностного EJB.ejbCreate и ejbPostCreate.create EJBHome.create() EJBHome.В следующих примерах в общих чертах показано, как заменить функцию автоматической генерации ключа Oracle. Для каждого EJB CMP, использующего автоматически генерируемые порядковые номера Oracle, потребуется написать аналогичный код. Рекомендуется создать вспомогательные классы, содержащие общие фрагменты кода для генерации порядковых номеров EJB.
ejbCreate и ejbPostCreate сущностного EJB.Было:
|
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 ... |
Стало:
|
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.|
public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException { ... setCardID(sequenceID); ... } |
create EJBHome.Было:
|
public Card create(String cardNumber, String lastName, String firstName, java.sql.Date issueDate) throws CreateException; |
Стало:
|
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() EJBHome.| Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate); |