需求是这样的:由一个后台程序去给数据库新增一条记录,其中有的字段是Clob类型的。该表的主键是Sequence生成。
1.建立Entity Object
其中ID的Type为oracle.jbo.domain.DBSequence
2.建立View Object
3.在ApplicationModule中引入这个View Object. 并创建方法写入数据库。
public void testForClob(){
MssExtCommReqLogVOImpl vo = this.getMssExtCommReqLogVO1();
MssExtCommReqLogVORowImpl row = (MssExtCommReqLogVORowImpl)vo.createRow();
row.setRequestName("test7");
try {
row.setReqMessage(new ClobDomain("bbb"));
} catch (Exception e) {
e.printStackTrace();
}
vo.insertRow(row);
vo.getDBTransaction().commit();
}
程序出错,并得到以下异常:
Exception in thread "main" oracle.jbo.RowAlreadyDeletedException: JBO-25019: Entity row with key null is not found in MssExtCommReqLogEO.
at oracle.jbo.server.OracleSQLBuilderImpl.doEntitySelectForAltKey(OracleSQLBuilderImpl.java:879)
at oracle.jbo.server.BaseSQLBuilderImpl.doEntitySelect(BaseSQLBuilderImpl.java:566)
at oracle.jbo.server.EntityImpl.doSelect(EntityImpl.java:8589)
at oracle.jbo.server.EntityImpl.doDMLWithLOBs(EntityImpl.java:8893)
at oracle.jbo.server.EntityImpl.doDML(EntityImpl.java:8797)
at oracle.jbo.server.EntityImpl.postChanges(EntityImpl.java:7017)
at oracle.jbo.server.DBTransactionImpl.doPostTransactionListeners(DBTransactionImpl.java:3301)
at oracle.jbo.server.DBTransactionImpl.postChanges(DBTransactionImpl.java:3104)
at oracle.jbo.server.DBTransactionImpl.commitInternal(DBTransactionImpl.java:2108)
at oracle.jbo.server.DBTransactionImpl.commit(DBTransactionImpl.java:2389)
at com.emerson.testadf.main.model.am.AppModuleImpl.testForClob(AppModuleImpl.java:67)
解决方法:
编辑该Entity Object 的Id属性,在Refresh After 中选中Insert,保存, 若保存不成功,则手动修改xml文件上,在 Attribute Name="Id" 处加上RetrievedOnInsert="true"
再运行,成功。
分析: 在oracle中对Clob类型的字段操作需要先插入empty_clob(),然后再修改,ADF模拟这个动作,但是在插入后更新时没有到Id的值,所以引发上述的异常,若是将Entity Object中的属性修改为insert后更新就可以获得Id的值自动将其更新。