Ошибка повторения таблицы для получения всей строки и обработки некоторых из них в adf

Я получаю ошибку в моем проекте. Я разрабатываю с Oracle ADF. Вот краткое изложение:

У меня есть поток задач, который содержит 2 представления:BrowseBusiness (представление по умолчанию) и ChooseBusiness. Затем у меня есть страница jspx, содержащая регион из потока задач.

В Обзоре бизнеса у меня есть 2 кнопки: Добавить и Удалить. Если я нажму «Добавить», появится надпись «Выбор бизнеса» с флажком в одном из столбцов. Я проверю некоторые из них, и когда я нажму «Сохранить», он должен выполнить итерацию, чтобы узнать, какую строку я выбираю, а затем сохранить ее в БД.

Моя проблема в том, что он не смог выполнить итерацию при сохранении Business. Вот мой код для сохранения:

       final RichTable table = this.getBisnisTabel();
       final AppModuleImpl appModul =
           (AppModuleImpl)ADFUtil.getApplicationModule("AppModuleDataControl");

       FacesContext facesContext = FacesContext.getCurrentInstance();
       VisitContext visitContext =
           RequestContext.getCurrentInstance().createVisitContext(facesContext, null, EnumSet.of(VisitHint.SKIP_TRANSIENT,
                                                                                                 VisitHint.SKIP_UNRENDERED),
                                                                  null);
       //ERROR IN HERE
       UIXComponent.visitTree(visitContext, facesContext.getViewRoot(), new VisitCallback() {
               public VisitResult visit(VisitContext context, UIComponent target) {
                   if (table != target) {
                       return VisitResult.ACCEPT;
                   } else if (table == target) {
                       //Here goes the Actual Logic
                       //for adding new Business
                       selectAllRowsInTable(table);
                       Iterator selection = table.getSelectedRowKeys().iterator();
                       while (selection.hasNext()) {
                           Object key = selection.next();
                           //store the original key
                           Object origKey = table.getRowKey();
                           try {
                               table.setRowKey(key);
                               Object o = table.getRowData();
                               JUCtrlHierNodeBinding rowData = (JUCtrlHierNodeBinding)o;
                               Row row = rowData.getRow();
                               if (row.getAttribute
                                   ("Selected") != null) {
                                   if ((Boolean)row.getAttribute("Selected"))
                                   {
                                       appModul.saveMTypeOfPolicyGrpBizCode(row.getAttribute("BizCode").toString());
                                       row.setAttribute("Selected", false);
                                   }
                               }
                           } catch (Exception ex) {
                               ex.printStackTrace();
                           } finally {
                               //restore original key
                               table.setRowKey(origKey);
                           }
                       }
                   }
                   return VisitResult.COMPLETE;
               }
           });

Это код для выбора всех строк в таблице:

public void selectAllRowsInTable(RichTable rt) {
    RowKeySet rks = new RowKeySetImpl();
    CollectionModel model = (CollectionModel)rt.getValue();
    int rowcount = model.getRowCount();
    for (int i = 0; i < rowcount; i++) {
        model.setRowIndex(i);
        Object key = model.getRowKey();
        rks.add(key);
    }
    rt.setSelectedRowKeys(rks);
}

Я в замешательстве, потому что, когда я использовал аналогичный код для удаления бизнеса в представленииBrowseBusiness, он работал очень гладко. Вот код:

            final RichTable table = this.getBizPolicyTable();
        final AppModuleImpl appModul =
            (AppModuleImpl)ADFUtil.getApplicationModule("AppModuleDataControl");

        FacesContext facesContext = FacesContext.getCurrentInstance();
        VisitContext visitContext =
            RequestContext.getCurrentInstance().createVisitContext(facesContext,
                                                                   null,
                                                                   EnumSet.of(VisitHint.SKIP_TRANSIENT,
                                                                              VisitHint.SKIP_UNRENDERED),
                                                                   null);
        //Annonymous call
        UIXComponent.visitTree(visitContext, facesContext.getViewRoot(),
                               new VisitCallback() {
                public VisitResult visit(VisitContext context,
                                         UIComponent target) {
                    if (table != target) {
                        return VisitResult.ACCEPT;
                    } else if (table == target) {
                        //Here goes the Actual Logic
                        //for deleting multiple Business of Policy

                        CollectionModel cm =
                            (CollectionModel)getBizPolicyTable().getValue();
                        RowKeySet rowKeySet =
                            (RowKeySet)getBizPolicyTable().getSelectedRowKeys();
                        Object[] rowKeySetArray = rowKeySet.toArray();
                        for (Object key : rowKeySetArray) {
                            cm.setRowKey(key);
                            //store the original key
                            JUCtrlHierNodeBinding rowData =
                                (JUCtrlHierNodeBinding)cm.getRowData();
                            try {
                                Row row = rowData.getRow();
                                appModul.deleteMTypeOfPolicyGrpBizCode(row);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            } finally {
                                //restore original key
                            }
                        }
                        appModul.getTypeOfPolicyBizCodeView3().executeQuery();
                        appModul.getTypeOfPolicyBizCodeView1().executeQuery();
                    }
                    return VisitResult.COMPLETE;
                }
            });

Что-то не так в моем коде? Спасибо за любой отзыв :)

ОБНОВЛЕНИЕ: попробуйте отладить мой проект. В этой строке:

Object key = selection.next();

Значение равно нулю. не знаю почему..

И я получаю эту ошибку: ограничение «TYPE_OF_POLICY_BIZ_CODE_FK1» нарушено во время пост-операции «Удалить» с использованием оператора SQL «УДАЛИТЬ ИЗ M_BUSSINESS MBussiness WHERE BIZ_CODE =: 1».

Здесь я снова запутался, потому что я пытаюсь добавить, а не удалить значения. Я делаю неправильно?


person lucia    schedule 02.12.2012    source источник


Ответы (2)


Похоже, вы получаете ссылку на AM напрямую:

final AppModuleImpl appModul =
           (AppModuleImpl)ADFUtil.getApplicationModule("AppModuleDataControl");

Эта практика не рекомендуется. Вы нарушаете свои слои Model и View и вносите хрупкость в свой дизайн. Гораздо лучше и рекомендуется: 1. Представить метод AM как сервисный метод на AM 2. Привязать этот метод к вашей странице 3. Вызвать метод из вашего вспомогательного компонента.

https://blogs.oracle.com/jdevotnharvest/entry/best_practice_invoking_business_services

Что касается проблемы, с которой вы столкнулись, было бы полезно знать: Версия продукта.

Кроме того, кажется, что вы удаляете здесь:

 appModul.deleteMTypeOfPolicyGrpBizCode(row);

Да?

person Joe    schedule 02.12.2012

Вместо создания нового RowKeySetImpl попробуйте получить существующий с помощью getSelectedRowKeys(). Или измените свою логику, чтобы перебрать все строки и полностью удалить логику выбранной строки. Это похоже на дополнительную работу, в которой нет необходимости.

person Billy Bob Bain    schedule 02.12.2012
comment
проблема в том, что таблица не позволяет выбирать, поэтому выбранный ключ строки равен нулю. Я прав? - person lucia; 02.12.2012