Oracle ADF 学习笔记 -- Entity Object

通过这个把月的接触,我觉得自己已经非常喜欢ADF这个框架了。 简单地说,ADF分UI层和BC层, 并有Jdev提供了完美的支持,可以极大提高软件的开发效率,今年的目标就是好好研究下ADF。 

说到UI,我之前觉得Ext的UI已经非常不错了,不仅美观,同时还提供了非常完善的用户体验,简单地几行代码就能做出令人赞叹的界面。 ADF的UI,美观以及体验绝对不会输给Ext,同时有Jdev的支持, 采用Drag&Drop的方式,并提供130多个Component, 开发效率更是不必说了。 

后面的BC层曾也是非常强大,AM,EO,VO通过各种配置就能实现很多业务逻辑,能减少很多开发人员手工代码量,避免了很多出错的可能性。  UI,BC 完美结合,有时拉个VO到UI上,一个界面就基本完成了,真是爽到不好怎么说了。 


============================================================ 
下面列出一些学习笔记,以供随时复习: 


配置connection里面data type map,在加载了数据,以后是不能够修改的, 老版本的ADF用的是Oracle Domain, 新版本全部用的是java extended for oracle。 除非是开发兼容版本, 不然我们都应该是后者。 



选择EO,或者任意的Model,点击Diagram,以及里面的Link,那么就能看到各种关系 


AM实现了一组通用的SOA接口,用来管理用户的数据,比如,findViewObject 还有一系列的调用link, association的方法。  各个Remote AM之间,是否也是可以互相访问,那样的话,远程的方法也可以通过AM直接调用到了。 


什么是Active Data Model: Data 在前台,后台的修改都会自动同步, 而这种同步采用的是SOA的方式 


full source code有助于理解框架并且使用框架, 同时也利于Debug. 


ADF是Plain Java以及XML,有利于Component在Container里面调用,同时也可以在各种应用程序中调用,比如command line, jsp, service, desktop等 


ADF的主要源代码在oracle.jbo和oracle.jbo.server这两个包里面, 前者是interface,后者是实现者 


包的命名规则: 公司名.项目名.子项目名.模块名.(queries,service,entities ).  keep in mind, ADF的Component是为重用而设计的,所以包的设计也考虑这一点 


AM可以是只有单个的XML,如果你不需要而外的方法,那么XML文件加上配置上的VO,你也可以很好的使用到AM,以及后台的VO, 使用的Class是oracle.jbo.server.ApplicationModuleImpl,  而如果你声明创建了class, 那么使用的Class就是你创建的那个class. 


如果view层不是用ADF,那么使用后台数据的时候要用相应的类型,  import oracle.jbo.domain.Number;  而不是java.utils.Number.  后者会有编译错误。 


访问Component数据,可以采用通用的方法,或者是固定类型的方法, 如 getAttribute(salary),  或者 getSalary(), 这些都是component已经生成好的方法 


BC层向Client (UI或其他展示) 提供的访问Component包括, AM本省, AM所关联的VO,  以及VO的Row.    EO 则是不会直接给到Client 


命名EO的时候,最好使用其表名的单数形式, EO相关的association, events, formatters, validators等都作为entities的子package,分别保存起来 


EO 的mandatory flag是用来定义是否可以是null 


用Business Components from Tables wizard来创建EO,VO, AM, 可以非常快速的创建好,同时如果表之间有foreign key 的话,那么association也可以随之创建 


如果目标Table没有primary key, 那么EO将会加上一列RowID, 对应Table中的rowId作为主键 


如果把EO建立在view上面,那么RowId也是被作为了primarykey(by table wizard方法)。  另外如果是create EO的wizard,那么就是需要手工去指定一个primary key 


设计好EO之后,可以通过在EO的package上右键选择Create database Object来生成Table, 注意相关的字段类型,目前测得, Long无法生成, 需要改Number(18) 


当新的字段添加到Table以后,需要synchronize的方法来将更新同步到EO里面。 是否需要重新连接才能显示出表的更新呢?  目前是重启了以后才能发现那个新的Column,然后更新到EO里面。 
而如果是Table里面删除了字段以后,如果想跟新到EO里面,就比较麻烦了,需要在EO里面删除Attributes 


如果是Table的Column类型发生了改变(alter table employee modify (salary varchar2(18))),sychronized可以把attribute更新好,但是引用该字段的程序需要手动去查询。 


创建effective data entry,  这种设计在HRMS里面非常常见,  对于某个记录,有效期是由startDate和endDate确定的, 另外再加一个sequence,用来跟踪这个数据当天变化多次的情况, 同时还有一个sequenceFlag来标示最新的一个change. 如果没有sequence,那么同一天的变化是不允许的 
一般用于有实效性的记录,比如: what are the benifit for the employee on Auguest 21st, 2005? 
目前jdev里面关于生成effective data entry 的方法没有测试成功.  后续CRUD的时候再用代码测试 


组合关联:relationship 分aggregation or composition,   引用, 或者是包含。    引用的话,删除其中的一个Entry,不应该导致另外一个Entry的删除。  而处于包含关系的话, 删除其中一个,会需要删除另外一个Entry,来保持整体的完整性。 一般创建的是refference的, 如果选择了 cascade delete,那么就是后者了。 



Group Directory 能够将diagram和src分成2个包。 对diagram名字的修改不会导致Entity的名字修改 


关于formater和mask, 都是在C:\Documents and Settings\username\Application Data\JDeveloper\system##\o.BC4J\formatinfo.xml里面定义, 对于每个domain,如java.util.Date, 可以定义一些fomatter 


resource bundle是自动生成的properties,在project properties里面配置。  另外关于Resource Bundle的国际化部分不是太明白。。 


创建Business logic Group来让EO按指定的方式工作, 这些个Group是否可以重用,如果不能重用,那么他和Eo的logic validtion有什么区别?  区别在于它独立存储, 能够动态加载到让某些row具备这些特性,有些不具备。  
当一个EO的业务逻辑特别复杂,并且在不同的子系统里面业务子集不同的时候,这个Group可以分组,让不同的开发群组,定义自己的业务集合。 


如果要创建logic unit, 必须先将attribute设置为overwrite, 然后才能添加valicator, uihint.   如何使用这些business logic,讲的不是太清晰,需要测试 


EO的Alternate Keys, 意思是让你有机会定义另外一个可以作为主键的attribute 


Update Batching是EO general里面对性能影响比较显著的一个参数, 设置一次性提交修改的DML个数。  但前提是没有任何attribute设置了 refresh in update 等三个参数 


Updatability of an Attribute: 一个attr是否可以被修改,While new是在第一次insert并且在commit之前,是可以修改的 


attr的Mandatory设置,运行于Entry Level, 用来检验这个attr是否非null. 


EO支持联合主键, getKey也是可以get到联合主键。 特别要注意的是联合主键的顺序, 通过key去get Record,如果设置的顺序不正确,那么也是拿不到任何值的。 


当column上面有trigger的时候,我们可以打开refresh on insert或者refresh on update来获得trigger之后的值, 


如果把attr的type设置为了DB Sequence,那么他将会被自动赋值,Sequence里面获得 


RowInconsistentException. 当前需要更新的Row如果发现了已经被其他user修改了,那么就报这个Exception, 用来确保consistence 


TrackChange History的选项,可以把一些Table的定义项,用来作为track的记录保存, 比如version number, create on , modify by 等 


有组合关系的Entity创建的时候,子组建的创建时会进行一项检测,看FK的父组件是否存在,不然就抛出InvalidOwnerException.  这个检测不仅在DB里面,同时也会检查Pending的Entity. 


implement for db cascade delete, 让delete动作在commit的时候生效。 


implement cascade, 让删除parent的时候,自动也删除children 


Cascade Update: primary key更新的时候,其fk也被相应地更新。 


Locking of Composite Parent Entities: 修改children的时候, parent entity是否需要被lock住 
Updating of Composing Parent History Attributes:   parent entity 的history attr是否需要被update 

Entity Object Inheritance Hierarchies: 这也是一种比较规范的表设计方式, 比如表里面有type这个字段,同时有一些字段只和某种type相关,这时将这些字段拆分成单独的子表是比较好的设计方法。 


Alternate Key: 可以让程序使用findByKey的方式来查找到Entity, 这样就避免了使用sequence key的尴尬。  在实现上,采用alter key,在内存里面相当于多了个用alter key作为key的HashMap,用来访问Entity 


default value里面的expression引用到的column,必须是dependency里面所列举出来的。 另外, 如果是在java的get方法里面设置好了计算并且返回了值,也需要在dependency里面声明,确保能够同步刷新 


OracleMediator,是和Component Event相关模块, Component由于某些动作比如create,产生event,然后在另外一些Component里面订阅解释这些event,所以当一个event产生后,process就会开始运作。 


关于Event, Transactional Event和Synchronized event都是不被框架支持的, 前者是Event作为事务的一部分,可以被Rollback,后者是同步Event,必须等到Event确认才能结束。 


定义好Event后,给EVent选择Event Point,  Create delete, change,  同时还要选择condition, 比如某个值等于多少的时候,才raise. 这相当于更加细粒度地进行了raise的控制, 如果没有raise condition,那么就应该是在Event Point的时候就raise. 


Children Entity在Raise Event的时候,不管children raise了多少event,在一个transaction里面,都只能有一个parent的event被raise出去。 


Event里面的字段是能够支持大字段的ClobDomain attributes, 但是对performance会有一定的影响。 关于Event的订阅,目前还没有测试, 


EntityImpl是所有Entity的java class都会继承的类,如果没有Java class的话,ADF就是使用EntityImpl加上XML来实现Entity所有功能的 


创建Entity的时候,是否需要自动创建java, View 或者是AM, 可以配置的。 tool -- preference -- adf component 


Entity的attribute value不是存在privagte + getset的属性里面,而是以一组顺序存在Array里面, 其目的是为了和XML 和attribute的顺序match, 保存一组attr顺序的信息,  从而在更新XML的时候,能够找到正确的位置,添加上合适的Code,或者在合适的位置删除Code 
不要修改set/getAttrInvokeAccessor, 如果要更改属性的顺序,用UI editor来修改,这样能同步XML和Java Code.  手工修改index是不可以的。 


创建primarykey是通过EOImpl的static createPrimarykey方法, findByPrimaryKey是EoImpl.getDefinitionObject().findBPrimaryKey(xxxx); 

创建新Entity采用def的createInstance2方法 

生成sequenceNumber并加入到新创建的Entity里面,可以通过override create方法,然后生成number, setAttr进入Entry.   SequenceImpl s=new SequenceImpl("name",getDBTransaction());    s.getSequenceNumber() 
而这个sequencename是数据库中存在的sequencename,通过custom property加入到Entity中 


采用delete标识符来替代真正的physic delete, 需要做2件事, 第一,setDeleteFlag('Y'),  然后override doDML,在里面做些修改  if(operation==DML_DELETE) operation=DML_UPDATE 


domain type可以添加和修改,比如创建一个EmailAddress的Type,使用这样的Type就可以免去很多个普通String上面关于EmailAddress的校验 


HistoryType也是可以添加自己的类型,但同时要overide getHistoryContextForAttribute方法 


Entity Object也可以建立在SQL/PLSQL/View上面,这样的话,相关的Insert,update, delete在执行doDML时,要采用相关的procedure来完成功能 


创建有继承关系的EO,需要在Extend一栏目填上super class的类型,在column里面去掉不需要的column. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值