天天看点

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的值自动将其更新。