Показаны сообщения с ярлыком adf. Показать все сообщения
Показаны сообщения с ярлыком adf. Показать все сообщения

вторник, 13 мая 2014 г.

ADF: Ошибка InvalidOwnerException JBO-25030 при одновременном создании master- и detail-записей

Ошибка:
При создании Master- и Detail-записи последовательно через ADF Data Binding, например как в следующем коде:
  public String createMasterDetail() {
  
   BindingContainer bindings = getBindings();  
   OperationBinding operationBinding =  
   bindings.getOperationBinding("CreateInsertMaster");  
   Object result = operationBinding.execute();  

   OperationBinding operationBinding1 =  
   bindings.getOperationBinding("CreateInsertDetail");  
   result = operationBinding1.execute();  

   return null;  
  }  
Причина:
При создании новой строки через ADF Data Binding её статус будет STATUS_INITIALIZED. А когда Detail-запись пытается найти Master-запись в кеше (у которой статус STATUS_INITIALIZED), то будет брошено исключение InvalidOwnerException.

Решение:
  1. Установить флаг Сascade Update Key Attributes в ассоциации между Master- и Detail-сущностями;
  2. Сгенерировать View Row Class (...ViewRowImpl) для Master-сущности и переопределить в нём следующий метод:
      @Override  
      public void setNewRowState(byte b) {  
       if (b!=Row.STATUS_INITIALIZED || getNewRowState()!=Row.STATUS_NEW){  
       super.setNewRowState(b);  
       }  
      }  
    
Пример простейшего ADF-приложения здесь.

вторник, 19 апреля 2011 г.

Проблема в Oracle JDeveloper 11.1.1.4 при автогенерации HumanTask...

Описание: создадим простой BPM-проект с двумя HumanTask-ами и одной ролью (с несколькими ролями ситуация подобна этой).

1. Запустим JDeveloper.
2. Создадим новый BPM Application.

     Введите наименование проекта. Далее "Next":

     Далее "Finish":


     Далее предлагается создать BPM-процесс:


     Далее "Next":

3. Сгенерировался BPM-процесс.


4. Добавим ещё один UserTask.


5. Создадим определение UserTask-ов.

     UserTask1:

     UserTask2:

6. Сгенерируем формы пользовательского интерфейса с помощью автогенератора.

     UserTask1:


     UserTask2: аналогично UserTask1.

7. Получилось три проекта в нашем TestApplication: собственно BPM-проект и два Taskflow-проекта(HumanTask-проекта).

8. Задеплоим TestApplication на сервер BPM Suite.


     Далее "Next":

     Выбираем все TaskFlow-проекты. Далее "Next":

     Далее "Finish"

9. Заходим в BPM Workspace
9.1. Инициируем процесс.

Отправляем дальше:

Получаем первую ошибку:

9.2. Переходим на вторую задачу и получаем ошибку:

В чём причина этих ошибок???
Первая ошибка: автоматически не создалась страница Empty1.jspx
Вторая ошибка: при автогенерации форм для HumanTask-ов они создаются в одном и том же пакете и при деплое приложения возникает конфликт, который проявляется как "Error 500--Internal Server Error"

10. Исправление ошибок.
10.1. Первая ошибка:
10.1.1. Перейти в первый TaskFlow-проект в "Web Content"->"Page Flows"->"adfc-config".


10.1.2. Создайте Empty1.jspx дважды кликнув на эту страницу.


10.1.3. Аналогично с вторым TaskFlow-проектом.

10.2. Вторая ошибка:

10.2.1. Перейти в первый TaskFlow-проект в "Application Sources".


10.2.2. Провести рефакторинг пакета.


     Далее:

10.2.3. Открыть DataBindings.cpx и перейти на закладку "Source"


10.2.4. Изменить данный файл (см. выделение красным)


10.2.5. Удалить сгенерированные классы с прошлой сборки (удалить все внутри папки classes).

10.2.6. Аналогично с вторым TaskFlow-проектом.

11. Передеплоить TestApplication на сервер BPM Suite.