需求是這樣的:由一個背景程式去給資料庫新增一條記錄,其中有的字段是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的值自動将其更新。