您的位置:首页 > 其它

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

2015-08-10 14:47 381 查看
开发环境: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));

from:
http://maping930883.blogspot.com/2010/04/adf057adf-bc.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: