Jdev 版本:11.1.1.7
我使用以下查询创建了一个基于部门 VO 的部门 EO:
SELECT DeptEO.DEPARTMENT_ID,
DeptEO.DEPARTMENT_NAME,
DeptEO.MANAGER_ID,
DeptEO.LOCATION_ID,
DeptEO.ACTIVE
FROM DEPARTMENTS DeptEO where DeptEO.DEPARTMENT_ID > 250
UNION
SELECT 280 , 'Advertising',200,1700,'Y' from Dual
为简单起见,我使用了双表中的示例语句,在实际场景中,UNION 子句之后的查询将从表中填充。运行查询后,我得到了 UI 上所需的结果。
现在我的要求是将这个新创建的 DEPARTMENT_ID 为 280 的行插入到数据库表 DEPARTMENTS 中。提交时,ADF 将错误抛出为“oracle.jbo.RowAlreadyDeletedException: JBO-29114”,这是正确的,因为 DB 表中缺少该行,因此当它锁定该行以进行更新时,它没有找到任何事物 。
有什么方法可以指示 ADF 将此行视为 Insert 而不是 update 。我们还尝试将此行的数据填充到从 RowSetIterator 创建的新行实例中,然后通过调用 removeFromCollection() 删除罪魁祸首行,然后插入重复的行,但仍然没有运气。
我们正在考虑的其他方法是:
1- 创建另一个 VO/EO 并通过它们在表中插入值。2-为此查询创建一个数据库视图并在此视图上触发,所以当更新操作到来时,我们在触发器中执行我们的逻辑,即决定是更新还是插入数据。
您能否指导在这种情况下应该做什么。
问候,
悉达多
编辑:插入行的代码(我正在尝试但它不起作用)
RowSetIterator rsi=iterator.getRowSetIterator();
Row editableRow= rsi.createRow();
while(rsi.hasNext()){
Row r =rsi.next();
if((""+r.getAttribute("DepartmentId")).toString().equals("280") ){
System.err.println("? Equality row found!!!");
editableRow.setAttribute("DepartmentId", r.getAttribute("DepartmentId"));
editableRow.setAttribute("DepartmentName", r.getAttribute("DepartmentName"));
editableRow.setAttribute("ManagerId", r.getAttribute("ManagerId"));
editableRow.setAttribute("LocationId", r.getAttribute("LocationId"));
editableRow.setAttribute("Active", r.getAttribute("Active"));
rsi.removeCurrentRowFromCollection();
}
}
if(editableRow !=null){
System.err.println("? Row value after removal : "+editableRow.getAttribute("DepartmentName"));
rsi.insertRow(editableRow);
operBindingCommit.execute();
}