天天看點

ADF如何儲存Clob字段

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