2010年4月3日星期六

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

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

ADF-BC中的EO对象一般来说不需要写代码,但在实际开发中,有时需要增加一些额外的操作,这就需要写代码了。
这里把一些常用情景的代码贴出来,供大家参考。
增加EO涉及到主键的赋值问题,一般主键都是来自于Sequence。
下面分情况介绍。

1. 主键来自于Sequence,需要自己获取并在插入时赋值。

1.1 实现方法一:把Sequence设置在Custom Properties中,然后重写EO的create方法,获取SequenceNumber。
(1)首先为Department表,创建Sequence。
CREATE SEQUENCE "HR"."DEPARTMENTS_SEQ" MINVALUE 1 MAXVALUE 9990 INCREMENT BY 10 START WITH 280 NOCACHE NOORDER NOCYCLE ;

(2)双击EO,选择生成EO的实现类,注意勾上Create Method。

(3)选择Refresh on Insert

(4)在Custom Properties中,增加一个属性
Name:SequenceName。
Value:DEPARTMENTS_SEQ。该名称即是数据库中的Sequence的名称。


(5)Override EO的Create方法。
    /**
     * Add attribute defaulting logic in this method.
     * @param attributeList list of attribute names/values to initialize the row
     */
    protected void create(AttributeList attributeList) {
        super.create(attributeList);
        for (AttributeDef def : getEntityDef().getAttributeDefs()) {
            String sequenceName = (String)def.getProperty("SequenceName");
            if (sequenceName != null) {
                SequenceImpl seq = new SequenceImpl(sequenceName, getDBTransaction());
                //setAttribute(def.getIndex(), seq.getSequenceNumber());
                setAttribute(def.getIndex(), Integer.valueOf(seq.getSequenceNumber().intValue()));
            }
        }
    }
以上代码说明了获取定义在Attribute上的Customer Properties。


(6)创建页面,拖放生成Form,拖放CreateInsert Operation。
点击Create或CreateInsert,会发现DepartmentId自动获取到了下一个Sequence值。

(7)如果要定制创建EO的代码,比如返回新建对象的ID值,我们可以在AM中增加方法
    public int createDepartment(String name, int managerId) {
        EntityDefImpl deptDef = DepartmentsImpl.getDefinitionObject();
        DepartmentsImpl newDepartment = (DepartmentsImpl)deptDef.createInstance2(getDBTransaction(), null);
        newDepartment.setDepartmentName(name);
        newDepartment.setManagerId(Integer.valueOf(managerId));
        try {
            getTransaction().commit();
        } catch (JboException ex) {
            getTransaction().rollback();
            throw ex;
        }
        return newDepartment.getDepartmentId().intValue();
    }

(7)运行AM,测试createDepartment


Project 下载:ADF_BC_EO(3).7z

1.2 实现方法二:使用Groovy Expresssion设置DepartmentId的默认值。
(1)注释掉DepartmentsImpl.java中的create方法。
(2)使用Groovy Expresssion设置DepartmentId的默认值。
(new oracle.jbo.server.SequenceImpl("DEPARTMENTS_SEQ",object.getDBTransaction())).getSequenceNumber()
(3)运行页面,效果和实现方法一一样。
(4)运行AM,测试createDepartment,效果和实现方法一一样。
这种方式显然比方法一要好,不用设置Custom Properties,不用重写create方法。

Project 下载:ADF_BC_EO(4).7z

参考文献:
1. http://oracleseeker.com/2008/11/11/how_to_create_new_entity/

没有评论: