EBS OAF开发中实体对象和视图对象的属性设置器

(版权声明。本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)

源文:

Home > Oracle Application Framework Documentation Set, Release 12.2 > Oracle Application Framework Developer's Guide > Chapter 5: Implementing Server-Side Features > Entity Object and View Object Attribute Setters

概览

在oracle.apps.fnd.framework.server.OAEntityImpl和oracle.apps.fnd.framework.server.OAViewRowImpl类中有非常多方法使你在编程的时候为实体对象和视图对象设置属性值。这篇文档解释了每一个可行的选项并在不同的情景下建议合适的使用。

注意:这里不解释怎样声明式设置实体对象和视图对象的属性值。能够參考Defaulting in Implementing the View

内容

这篇文档依据属性缓存的地方组织为两个基本的部分:

l  缓存在视图对象上属性值

l  缓存在实体对象上的属性值

阅读前提.

l  Java实体对象

l  视图对象的具体介绍-视图对象的属性类型和缓存(了解不同的视图对象属性类型)

缓存在视图对象上的属性值

方法概观

对于存储在视图对象层的属性(它们不映射到实体对象属性),你能够使用以下OAViewRowImpl中方法来设置属性值。

方法1:基本设置器-setAttribute()

1. setAttribute(String name, Object val)
2. setAttribute(int index, Object val)

这两个方法会运行你为它们定义的全部编程验证,然后在super.setAttribute()中,它们使用查找机制来查找并调用相关的set<AttributeName>()方法(注意。你必须在你的代码之后调用super.setAttribute())。

3. set<AttributeName>() //Attribute setter in OAViewRowImpl subclass

这种方法会运行你为这种方法定义的全部编程验证,然后调用方法setAttributeInternal()。注意,你必须在你的代码之后调用setAttributeInternal()方法。

这三个方法会标记依赖的视图对象的查询集合为”脏”状态(你调用它们之后,方法OAViewObjectImpl.isDirty()会返回true).关于isDirty()检查的很多其它信息请參考Advanced View Object DevelopmentTopics -> Entity Event Notification

方法2:setAttributeInternal( )

1. setAttributeInternal(int index, Object val)

这种方法会运行全部在视图对象XML文件里为视图对象属性指定的全部声明式验证。

setAttribute()方法一样。这种方法也会把依赖的视图对象的查询集合标记为”脏”状态。

由于这种方法仅仅运行声明式验证,你不应该覆盖它(你不须要这么做,由于它不应该包括编程式验证);你应该依据须要简单的调用它。

方法3:"Populate" Methods

1. populateAttribute(int index, Objectvalue)
2. populateAttributeAsChanged(int index, Object value)

这些方法会为属性设置值,可是不会运行不论什么验证也不会影响视图对象查询集合的”脏”标记。

你不要覆盖这种方法并往populate* 方法增加编程验证代码,由于这些方法就是用于简单为属性设置值。

注意:对于实体对象层属性。populateAttributeAsChanged(intindex, Object value)方法的行为不同;參考以下的“缓存在实体对象上的属性值”部分。

以下是一个自己定义视图行的演示样例演示了怎样使用这种方法设置表的选择器的值而不影响视图对象的状态。

public void setSelectFlag(String value)
{ //Do not call setAttributeInternal as usual in this method.
// setAttributeInternal(SELECTFLAG, value);
populateAttribute(SELECTFLAG, value); }

行为汇总

l  set*方法会运行验证并标记视图对象的查询集合”脏”状态。populate*方法简单设置值而不进行不论什么验证也不改变视图对象的状态。

使用便条

使用基本设置(选项1)应该作为使用规则,除非你有以下的特殊情形:

l  假设你须要忽略编程验证并仅调用声明式验证,那么你须要使用来setAttributeInternal(intindex, Object val)取代。

l  设置一个属性值而不触发验证或者不影响视图对象的查询集合的”脏”状态。要使用populateAttribute(intindex, Object value)方法.比方,像上面演示的。你可能覆盖一个table bean的”选择器”属性的设置器方法来使用populateAttribute()方法。这同意你存储特定的UI状态而不改变VO的状态。

关于“selector”的很多其它信息,可參考Tables - Classic and Tables - Advanced

注意:一定不要使用populate*方法来设置主键属性值(这对组合关系可能有不利后果)。应为主键属性使用主要的设置器。

缓存在实体对象上的属性值

对于存储在实体对象层的属性(它们不映射到实体对象属性),你能够使用以下OAEntityImpl中方法来设置属性值。

注意:在大多数情况下,你通常调用类OAViewObjectImpl 和OAViewRowImpl上上面描写叙述的方法来设置实体对象的值(VO方法终于代理潜在的实体对象方法)。当在你的OAEntityImpl子类中写代码时,可是。你能够调用以下的方法来直接设置实体属性值。

当你调用一个实体对象的比方set<AttributeName>()方法时,你的调用会影响以下的实体对象状态:

l  验证状态(Validationstate)-可通过调用来OAEntityImpl.isValid()检查

l  提交状态(Poststate)- 可通过调用来OAEntityImpl. getPostState ()检查

l  事务状态(Transactionstate)可通过调用来OAEntityImpl. getEntityState ()检查

由于BC4J为实体对象维护这些额外的状态(此外,为视图对象维护的基础的”脏”状态), OAEntityImpl方法细粒度控制怎样设置属性值。

方法概观

方法1:基本设置器-setAttribute()

1. setAttribute(String name, Object val)
2. setAttribute(int index, Object val

这两个方法会运行你为它们定义的全部编程验证,然后在super.setAttribute()中。它们使用查找机制来查找并调用相关的set<AttributeName>()方法(注意。你必须在你的代码之后调用super.setAttribute())。

3. set<AttributeName>() //Attribute setter in OAEntityImpl subclass

这种方法会运行你为这种方法定义的全部编程验证,然后调用方法setAttributeInternal()。

注意,你必须在你的代码之后调用setAttributeInternal()方法。

这三个方法会标记实体对象为无效状态并依据须要更改实体对象的提交状态和事务状态为STATUS_NEW或者STATUS_MODIFIED。以便BC4J知道实体对象有未提交的改动。

最后,这三个方法也会标记依赖的视图对象的查询集合为”脏”状态。(你调用它们之后,方法OAViewObjectImpl.isDirty()会返回true)

方法2:setAttributeInternal( )

1. setAttributeInternal(int index, Object val)

这种方法会运行全部在视图对象XML文件里为实体对象属性指定的全部声明式验证。和

setAttribute()方法一样。这种方法也会把依赖的实体对象标记为无效状态。改变提交状态和事务状态。也标记依赖的视图对象的查询集合为”脏”状态。

由于这种方法是用来只运行声明式验证。你不应该覆盖它(你不须要这么做,由于它不应该包括编程式验证);你应该依据须要简单的调用它。

方法3:"Populate" Methods

在看每一个单独的方法之前。来看一下在大多数populate*方法中能够使用的參数的描写叙述。

Method Parameter

Description

sendNotification

控制是否把实体属性值的改变事件广播给依赖的视图对象。改变事件会运行视图对象查询集合的状态(“脏”标记) .很多其它信息可參考 Advanced View Object Development Topics -> Entity Event Notification

markAsChanged

当这个參数设置为true时,这个属性被标记为已改变.

  • BC4J 在DML阶段期间会提交已更改的持久属性,可是只当实体对象的提交状态为 STATUS_NEW 或者 STATUS_MODIFIED ,因而插入一条心数据或者调用以下的方法来更改属性值setAttribute(), setAttributeInternal()或set<AttributeName>()

saveOriginal

控制BC4J是否在更改值之前保存原先从数据库中取到的值到额外的地方.

假设你想保存原先的值:

  • BC4J 比較原先的值和数据库里列上的值(加锁)来检測值是不是过期了.
  • BC4J 保存原先的值当提交失败时,在用户改正验证错误之后这些动作能够再次尝试.

假设原先的值没有保存,那么当前的属性值会被BC4J用来做这些操作.

1. populateAttribute(int index, Objectvalue)

这种方法的行为和以下的调用是一样的:

populateAttribute(index, value,
                   false,  // sendNotification
                   false,  // markAsChanged
                   false);// saveOriginal

2. populateAttributeAsChanged(int index,Object value)

这种方法的行为和以下的调用是一样的:

populateAttribute(index, value,

false, // sendNotification

true, // markAsChanged

false);// saveOriginal

3. populateAttribute(int index, Objectvalue,
                     booleansendNotification,
                     BooleanmarkAsChanged)

这种方法已经不建议使用了.它调用了populateAttribute(index, value, sendNotification,markAsChanged, false).

4. populateAttribute(int index, Object value,
                     BooleansendNotification,
                     BooleanmarkAsChanged,
                     BooleansaveOriginal)

l  你不应该覆盖这些方法并加入编程验证逻辑,由于这些方法都是用来简单设置属性值的。

l  这些方法不会影响实体对象的验证状态。提交状态或者事务状态。

l  视图对象的查询集合的”脏”标记可通过sendNotification标记值来影响。

建议的參数值

l  对于OAF应用,设置sendNotification为false因此视图对象的查询集合的脏标记不会被你的改动而影响。当视图对象的查询集合变脏。表中相似排序操作都是不同意的(很多其它信息可參考Tables - Classic and Tables - Advanced)。

l  设置markAsChanged为true,假设你想提交属性值和其它用户改动在DML期间提交到数据库的话。

l  假设你设置markAsChanged为true的话。就设置saveOriginal为true.作为规则,帮助合适的加锁和处理提交失败。假设你计划提交改动的属性值到数据库。saveOriginal參数应该设置为true.

行为汇总

l  set*方法会运行验证并标记实体对象为无效状态,改变实体对象的提交状态,改变实体对象的事务状态。并标记视图对象的查询集合为脏状态。

l  populate*方法简单设置值而不进行不论什么验证也不改变实体对象的状态。可是,视图对象的查询集合状态(包括脏标记)受sendNotification參数值的影响。

使用便条

使用基本设置(选项1)应该作为使用规则,除非你有以下的特殊情形:

l  假设你须要忽略编程验证并仅调用声明式验证。那么你须要使用来setAttributeInternal(intindex, Object val)取代。

l  为实体对象使用populate*方法是不鼓舞的。尽管那么说。可是,也有一些例外的情况你须要使用这些方法;以下描写叙述了这些用例,并针对属性类型有不同的建议(假设不熟悉这些类型的名称。可參考ViewObjects in Detail - View Object Attribute Types and Caching)。

注意:对于Java实体对象。一定不要使用populate*方法来设置主键属性值(这对组合关系可能有不利后果)。应为主键属性使用主要的设置器。

对于“刷新插入”行为的PL/SQL实体对象,很多其它信息,可參考PL/SQLEntity Objects - Creating Primary Keys

对于全部实体起源的属性类型。不要使用populateAttributeAsChanged(intindex, Object value)方法,除非你真的不关心在提交失败之后能不能又一次提交(由于populateAttributeAsChanged()方法的saveOriginal= false)。

实体起源的持久属性

对于视图起源的持久属性,在大多数情况下。你不须要调用populate*方法。

为一个新行设置这些属性的默认值。更好的方法是使用主要的设置器方法然后调用OAViewRowImpl.setNewRowState(Row.STATUS_INITIALIZED)方法来把这行作为”暂时”的直到用户对其做了改动。很多其它信息可參考View Object State Management CodingStandard M69

例外:

1.      要实现“刷新插入”行为的PL/SQL实体对象,你须要调用populateAttribute(index,value, false, false, false)方法。在DML操作之后commit之前。这是必须来马上同步属性值和数据库的值。像上面提到的一样,很多其它信息。请參考PL/SQLEntity Objects - Creating Primary Keys

2.      假设你想为实体起源的属性值设置这样它能够和其它用户改动的值一起提交而不触发验证或者不影响实体对象的验证。提交或者事务状态,或者实体对象查询集合的脏标记。比方,OAF框架用这样的方式设置标准的WHO字段和ObjectVersionNumber属性值。

实体起源的非持久属性

对于实体起源的非持久属性,通常来说。你应该在实体对象属性的getter(get<AttributeName>())方法计算并返回值而不是设置值。

l  假设由于一些原因,你不能使用这种方法,你仍旧能够使用主要的设置器方法-可是请注意这些调用会更改实体对象的验证,提交和事务状态和视图对象查询集合的脏标记。

也要明确你不应该存储不论什么UI状态到一个实体起源的非持久属性上。

注意:当视图对象行集合在提交后被刷新时。实体起源的非持久属性值会丢失。假设你想保留这些值,请參考Persisting Entity-Derived TransientAttribute Values After Commit

l  而不用主要的设置器方法,你能够使用populateAttribute(index,value, false, true, true)(设置markAsChanged属性值为true)来避免触发验证或者影响实体对象验证。提交或者事务状态,或者视图对象查询集合的脏标记。

注意:非持久属性值不映射到不论什么数据库的表列,因此,不会被提交。

也要明确你不应该存储不论什么UI状态到一个实体起源的非持久属性上。

l  避免使用參数markAsChanged为false的populateAttribute(intindex, Object value) 或者 populateAttribute()方法。

EBS OAF开发中实体对象和视图对象的属性设置器的更多相关文章

  1. EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充

    EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...

  2. EBS OAF开发中的错误/异常处理(ErrorHandling) (转)

    原文地址 EBS OAF开发中的错误/异常处理(ErrorHandling) EBS OAF开发中的错误/异常处理(ErrorHandling) (版权声明,本人原创或者翻译的文章如需转载,如转载用于 ...

  3. EBS OAF开发中实现參数式弹出窗体

    EBS OAF开发中实现參数式弹出窗体 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 概览 參数式弹出窗体和嵌入式弹出窗体不一样,它拥有独立 ...

  4. EBS OAF 开发中的OAMessageRadioGroup控件

    EBS OAF 开发中的OAMessageRadioGroup控件 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 简单介绍 RadioGro ...

  5. EBS OAF开发中怎样实现功能页签(Global Tab)

    EBS OAF开发中怎样实现功能页签(Global Tab) (版权声明.本人原创或者翻译的文章如需转载.如转载用于个人学习,请注明出处.否则请与本人联系,违者必究) 功能页签的实现不须要不论什么编码 ...

  6. EBS OAF开发中怎样通过ReferenceAO进行验证

    EBS OAF开发中怎样通过ReferenceAO进行验证 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) Reference AO 除了用于 ...

  7. OAF开发中一些LOV相关技巧 (转)

    原文地址:OAF开发中一些LOV相关技巧 在OAF开发中,LOV的使用频率是很高的,它由两部分构成一是页面上的LOV输入框(如OAMESSageLovInputBean),二是弹出的LOV模式窗口(O ...

  8. 解析iOS开发中的FirstResponder第一响应对象

    1. UIResonder 对于C#里所有的控件(例如TextBox),都继承于Control类.而Control类的继承关系如下: 代码如下: System.Object System.Marsha ...

  9. IOS开发中UITableView(表视图)的滚动优化及自定义Cell

    IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...

随机推荐

  1. IP address could not be resolved: Temporary failure in name resolution

    今早发现mysql日志中有非常多例如以下的警告: 140724 18:41:25 [Warning] IP address '172.16.18.217' could not be resolved: ...

  2. Vue小技巧,如何导入普通JS文件

    最近在开发一个展示3D模型的WEB程序,在工程中使用了VUE和ThreeJS库.Three.js本身是支持CommonJS的,但我们还用到了OBJLoader模块,此模块不支持CommonJS,改成C ...

  3. poj_3468,线段树成段更新

    参考自http://www.notonlysuccess.com/index.php/segment-tree-complete/ #include<iostream> #include& ...

  4. 51nod-1273: 旅行计划

    [传送门:51nod-1273] 简要题意: 给出一棵树,点数为n,现在你有一个旅行计划,从k城市出发,每天前往一个没去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去 ...

  5. MongoDB Shell (mongo)

    https://docs.mongodb.com/getting-started/shell/client/ The mongo shell is an interactive JavaScript ...

  6. SharePoint UserProfileService 接口列表 注解

    Remove Leader 除去领袖 Add Leader  加领袖 Get leaders  获得管理员 Get Profile Scherna Get Profile Scherna Names ...

  7. rails 开发随手记 7

    jQuery 1.9 中如何修改选择项 $("select option:contains(teacher5)").prop('selected', 'selected'); 效果 ...

  8. PostgreSQL Replication之第六章 监控您的设置(4)

    6.4 处理监控工具 还有几个监控工具可以使您的日常生活更轻松. 其中最流行的监控工具是Nagios.它被广泛地使用,也支持各种软件组件. 要使用 Nagios 来监控您的 PostgreSQL 集群 ...

  9. hdu1864/2844/2159 背包基础题

    hdu1864 01背包 题目链接 题目大意:一堆数,找到一个最大的和满足这个和不超过Q要学会分析复杂度! #include <cstdio> #include <cstring&g ...

  10. 比起 Windows,怎样解读 Linux 的文件系统与目录结构?

    Linux 和 Windows 的文件系统有些不同,在学习使用 Linux 之前,若能够了解这些不同,会有助于后续学习. 本文先对 Windows 和 Linux 上面文件系统原理.组织概念进行区分, ...