2010年4月3日星期六

ADF_054:ADF-BC中EO常用操作代码之三:增加EO(2)

开发环境:JDeveloper 11.1.2.2.0 + Oracle XE Database 10gR2。

2. 主键来自于Sequence,由Trigger触发,插入时不需要赋值。

2.1 实现方法一:主键类型为默认类型:Integer或BigDecimalInteger。
(1) 创建Schema、Table、Sequence、Trigger
sqlplus system/welcome1 @create_neverland_user.sql
grant connect, resource to neverland identified by neverland;
Exit;

sqlplus neverland/neverland @create_neveland_table.sql
DROP SEQUENCE uploaded_files_seq;
DROP TABLE uploaded_files;
CREATE TABLE uploaded_files(
id NUMBER PRIMARY KEY,
filename VARCHAR2(80),
content BLOB,
date_created DATE);
CREATE SEQUENCE uploaded_files_seq;
CREATE TRIGGER assign_file_id BEFORE INSERT ON uploaded_files FOR EACH ROW
BEGIN
SELECT uploaded_files_seq.NEXTVAL INTO :NEW.id FROM dual;
END;
.
/

(2)勾掉Mandatory,勾上Refresh on Insert
因为Id值来自于Sequence,不需要设置成强制的,所以勾掉Mandatory。
从这里我们对“主键和强制”有一个深刻的理解:主键不能为空,但不一定是人工必填项(可以来自程序自动填入)。
勾上Refresh on Insert是为了保证提交后,该值被刷新。


(3)点击Create Insert,ID项可以不输入。
说明:和《增加EO(1)》情况相比,这里点击Creat Insert时,并没有显示ID值,而是点击Commit按钮时,才刷新出来新ID值。


(4)点击Commit提交后,可以看到ID项自动被下一个Sequence填充。

(5)如果要定制创建EO的代码,比如返回新建对象的ID值,我们可以在AM中增加方法
 
     public int createUploadedFile(String name) {
        EntityDefImpl deptDef = UploadedFilesImpl.getDefinitionObject();
        UploadedFilesImpl newFile = (UploadedFilesImpl)deptDef.createInstance2(getDBTransaction(), null);
        newFile.setFilename(name);
        try {
            getTransaction().commit();
        } catch (JboException ex) {
            getTransaction().rollback();
            throw ex;
        }
        return newFile.getId().intValue();
    }

(6)测试 createUploadedFile


Project 下载:ADF_BC_EO_Sequence.7z

2.2 实现方法二:修改主键类型为为DBSequence。
(1)修改Id的类型为DBSequence。

(2)修改AM中的createUploadedFile方法。
    public int createUploadedFile(String name) {
        EntityDefImpl deptDef = UploadedFilesImpl.getDefinitionObject();
        UploadedFilesImpl newFile = (UploadedFilesImpl)deptDef.createInstance2(getDBTransaction(), null);
        newFile.setFilename(name);
        try {
            getTransaction().commit();
        } catch (JboException ex) {
            getTransaction().rollback();
            throw ex;
        }

        DBSequence newIdAssigned = newFile.getId();
        return newIdAssigned.getSequenceNumber().intValue();
    }

(3)重新运行页面,点击CreateInsert,会发现Id被自动填充了一个负值。
如果点击Commit,会报告一个异常,无法把该负值转换为DBSequence。

(4)因为Id值是自动填充的,无需人工填入,因此修改页面,删除掉Id的InputText,并重新运行页面,一切正常。

(4)重新测试createUploadedFile方法,效果与实现方法一一样。

Project 下载:ADF_BC_EO_Sequence(2).7z

参考文献:
1. http://www.javaoracleblog.com/java/Working_with_the_ADF_Business_Components_Programming_ADF_Entity_Objects__.jsf
2. http://oracleseeker.com/2008/11/11/how_to_create_new_entity/
3. http://oracleseeker.com/2009/09/06/adf_apply_sequence/

没有评论: