EBS OAF开发中的Java 实体对象(Entity Object)<一>
(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)
概览
l 关于实体对象
l 创建
l 更新/校验
l 删除
l 加锁
l 提交
l 回滚
l 事务撤回
l 对象版本号列
l 标准WHO列
l 错误处理
l 实体专家,验证视图对象和验证应用模块
l 调用PL/SQL方法和程序
l 多语言表(TL)的实体对象
l 标准验证模式/示例
关于实体对象
实体对象封装了业务逻辑和应用表的DML操作.
对象模型和关键的类
l oracle.apps.fnd.framework.server.OAEntityCache:这个缓存用于存储一个特定实体查询出的行.多个映射到同一个实体的视图对象共享同一个的实体缓存。
l <YourEntityName>EOImpl继承oracle.apps.fnd.framework.server.OAEntityImpl:这是视图对象本身.当实例化时,它代表了一行数据。
l oracle.apps.fnd.framework.server.OAEntityDefImpl:代表了描述实体对象的元数据,包括特征(attribute),事件,验证,联系和属性.当实例化时,它描述了实体对象类的所有实例。实体定义类是一个单例类。
l <YourEntityName>Expert继承oracle.apps.fnd.framework.server.OAEntityExpert: 这是一个特殊的单例辅助类,其注册于一个实体对象。
l oracle.jbo.Key:这是一个不可改变的主键,外键或者组合行标示器。
创建
要创建一个实体对象,你必须像下面演示的调用相应视图对象的createRow方法然后调用insertRow方法.
// In the application module; this example from the OA Framework
// ToolBox Tutorial will instantiate a SupplierEOImpl.
public void create()
{
OAViewObject vo = getSuppliersVO();
vo.insertRow(vo.createRow());
// Always call this after you perform a row insert. See the Entity Object
// New / Initial section below for additional information.
vo.setNewRowState(Row.STATUS_INITIALIZED);
}
视图对象的createRow()方法调用了潜在实体对象上的create()方法。在实体对象上的create()方法里添加所有设置默认值/初始化代码,就像ToolBox Tutorial 中的oracle.apps.fnd.framework.toolbox.tutorial.server.SupplierEOImpl类。
警告:不要在实体对象的构造器上放置任何初始化逻辑;一般应该添加在create()方法中调用super.create(attributeList)方法之后。
小建议:如果默认值在设计时就可以确定,并且对一个特定的UI合适,你也可以通过在OA扩展设置Initial Value属性来设置默认值。这些值可以被客户个性化;他们不必继承你的实体对象并重载create()方法来设置默认值。更多信息可以参考属性视图中的Defaulting主题。
/**
* In the SupplierEOImpl class; initialize a new supplier.
*/
Public void create(AttributeList attributeList)
{
super.create(attributeList);
OADBTransaction transaction = getOADBTransaction();
// Supplier id is obtained from the table's sequence
Number supplierId = transaction.getSequenceva lue("FWK_TBX_SUPPLIERS_S");
setSupplierId(supplierId);
// Start date should be set to sysdate
setStartDate(transaction.getCurrentDBDate());
} // end create()
小建议:当在你的实体对象中设置值的时候,一般调用set<AttributeName>(val)替代setAttribute("<AttributeName>",val),这样性能好点因为省略了查找步骤。要跳过任何代码中的属性验证,但还要做相应属性定义上声明式的验证,可以直接调用setAttributeInternal()。更多信息,参考实体和视图对象的属性设置器。
组合实体关系
在组合关系中,BC4J自动在子实体对象上设置父主键属性值。父主键值被传递给子的create()方法attributeList参数,并在调用super.create(attributeList)的时候设置值。
不要尝试自己填充父主键的值。
实体对象初始化/新建状态
默认,实体创建时的行状态是STATUS_NEW,BC4J会把它们添加到验证和提交监听列表。在这情况下,任何触发验证或数据库提交顺序的事件就会包含这些实体对象。
就像OA Framework Model Coding Standards描述的,在你插入新创建的行之后,应立刻明确调用ViewRowImpl的方法setNewRowState(STATUS_INITIALIZED)。参考上面的代码示例。这会设置所有关联的实体对象的状态为STATUS_INISTIALIZAED.
当你这么做的时候,BC4J会从事务和验证监听列表中移除相应实体对象,这样它们就不会被验证或者提交到数据库中。只要用户做了修改(一个属性的设置器被调用了),那么实体对象的状态就改变成了STATUS_NEW,并且BC4J就会把它返回添加到验证/提交列表。你也可以在任意时刻调用ViewRowImpl上的setNewRowState(STATUS_NEW)来修改状态。
特殊的”创建”情景
单行中“扁平的”主记录/明细
在OAF框架中的ToolBox Tutorial中,里面有显示给用户看到的单个,”扁平”行的,组合的主记录/明细实体。一个采购订单可能包含很多行,而且行相应的包含很多发运,但是在UI中我们显示行和发运为1:1的关系。
尽管BC4J可能很容易为一个单个视图行创建几个不同实体对象,这里这几个实体对象是无关的或者是同等的―如果这些对象之中一个是另一个的子的话,你就需要避免这个。在这种情况下,你必须添加下面自定义的create()方法到你的视图对象行实现来保证在低级别的实体上设置了正确的父键。
// The following is required to support the creating the master/d