Я получаю ошибку в моем проекте. Я разрабатываю с 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».
Здесь я снова запутался, потому что я пытаюсь добавить, а не удалить значения. Я делаю неправильно?