2010年4月3日星期六

ADF_057:使用ADF-BC级联删除主从记录

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

首先要明确一下级联删除应该什么情况下使用。
使用级联删除一般满足两个条件:
(1)A和B两个对象为主从关系,A为主,B为从。
(2)如果A对象不存在了,那么B对象也没有存在的意义。
也就是说,A和B的关系是合成(Composition)关系,详细说明请参考《UML中的类图 Class Diagram 》。
举例说明:
(1)员工对象Employees和工作历史JOB_HISTORY就属于合成(Composition)关系。
每个员工对象都可能有多个工作历史对象,当员工对象不存在了,与之关联的工作历史对象也没有存在的意义了。
(2)部门对象Departments和员工对象Employees就不属于合成(Composition)关系,因为即使部门对象不存在了,该部门下的员工仍然可以存在。

下面就以HR Schema中的Employees表和JOB_HISTORY表为例,来说明如何使用级联删除功能。

1. 实验准备:插入数据
INSERT INTO employees(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID) VALUES (901,'Ping','Ma','ping.ma2@oracle.com','26-AUG-2011','AD_PRES');
COMMIT;

UPDATE employees SET JOB_ID='FI_MGR' WHERE EMPLOYEE_ID=901;
COMMIT;

UPDATE employees SET JOB_ID='AD_VP' WHERE EMPLOYEE_ID=901;
COMMIT;

插入Employee对象后,再两次修改JOB_ID,这样在JOB_HISTORY表中会发现多了2条记录。
这是因为Employee表上有Trigger,当修改JOB_ID时,它会帮助我们向JOB_HISTORY表中插入数据。

2. 创建ADF Web应用
这一步比较简单,选择HR Schema中的Employees表和JOB_HISTORY表生成EO和VO就可以了。

3. 在默认配置下,运行AM
(1)选择EmployeeId=901的记录,点击删除,并Commit,会报出异常。

查看详细信息:发现Child Record,无法删除。

4. 修改JhistEmpFKAssoc association,使其支持级联删除

重新运行AM,选择EmployeeId=901的记录,点击删除,并Commit,记录被成功删除了。
查看JOB_HISTORY表,发现相关记录也被删除了。

参考文献:
1. http://my.opera.com/isaias.barroso/blog/cascade-delete-on-adf
2. http://blogs.oracle.com/raghuyadav/entry/adf_entities_association_-_cas
3. http://technology.amis.nl/blog/249/another-jdeveloper-extension-force-delete-utility-for-viewobjects-adf-business-components-pka-bc4j
create table dep (did number not null, dname varchar2(40), modified_by varchar2(40), modified_on Date, primary key (did));
create table emp (eid number not null, ename varchar2(40), did number,primary key (eid), foreign key(did) references dep(did));

没有评论: