вторник, 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-приложения здесь.