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/
没有评论:
发表评论