Файлы описания WebLogic для EJB с поддержкой хранения, управляемого контейнером
(CMP), позволяют приложениям использовать функцию для автоматической генерации
порядкового номера (ключа) базы данных. В случае использования этой функции
приложению WebLogic не нужно содержать код генерации следующего по порядку ключа при создании объектов EJB CMP.
В процессе миграции приложений WebLogic, использующих автоматическую генерацию
порядковых номеров, в приложения необходимо добавить код генерации
порядкового идентификатора для новых записей.
Файл weblogic-cmp-rdbms-jar.xml содержит
информацию для сущностных EJB, использующих хранение под управлением
реляционной СУБД WebLogic.
Это правило проверяет конфигурацию элементов
automatic-key-generation WebLogic и предоставляет информацию о
миграции в зависимости от типа генератора Oracle.
Ниже приведен пример элемента, который будет отмечен данным правилом:
< weblogic-rdbms-bean>
<ejb-name>Карта</ejb-name>
<data-source-name>MyDataSource</data-source-name>
<table-name>MY_TABLE</table-name>
...
< span class= "indent2"> < /span> < automati-key-generation>
<generator-type>Oracle</generator-type>
<generator-name>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.
- Задайте порядковый номер в соответствующем поле EJB в методах
ejbCreate и ejbPostCreate.
- Добавьте параметр порядкового номера в метод
create EJBHome.
- Добавьте логику для получения следующего порядкового номера для сущностного EJB CMP.
- Измените код в тех местах, где для передачи следующего порядкового номера используется метод
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
...
Задайте порядковый номер в соответствующем поле EJB в методе 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;
Добавьте логику для получения следующего порядкового номера для сущностного EJB 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");
}