本章包括以下几个部分:
第3.1节“关于ADF业务组件”
第3.2节“比较熟悉的4GL工具”
第3.3节“设计时设施概述”
第3.4节“概述了Oracle ADF活动数据模型”
第3.5节“概述ADF业务组件实施”
第3.6节“概述Groovy脚本语言支持”
ADF业务组件和JDeveloper简化Java EE平台的业务应用程序的开发,交付和定制。使用ADF业务组件,开发人员不需要编写应用程序基础设施的典型的Java EE应用程序所需的代码:
连接到数据库
检索数据
锁定数据库记录
管理事务
ADF业务组件解决了这些任务,通过其可重用的软件组件库,并通过配套设计时间在JDeveloper设施。最重要的是,开发人员节省时间以来的JDeveloper的设计时间使典型的开发任务完全声明使用ADF业务组件。特别是,JDeveloper支持声明式开发与ADF业务组件:
作者和测试业务逻辑组件,自动与数据库集成
通过多个基于SQL的数据视图重用业务逻辑,支持不同的应用任务
从浏览器,桌面,移动和Web服务客户端访问和更新的意见
自定义应用程序的功能层交付的应用程序,而无需修改
ADF业务组件的目的是使业务服务开发更富有成效。
ADF业务组件提供了一个基础的Java类,让您的业务层应用程序组件利用提供的功能在以下几个方面:
简化数据访问设计客户端显示的一个数据模型,包括只有必要的数据
包括主任何复杂的细节层次数据模型的一部分
实施最终用户查询示例数据滤波,而无需代码
自动协调与业务服务层的数据模型更改
自动验证并保存到数据库的任何变化
声明执行所需的字段,主键的唯一性,数据精确规模,以及外键引用
轻松捕获和执行既简单又复杂的业务规则,编程方式或声明,支持多层次验证
导航业务域对象之间的关系,并强制约束复合组件
自动反映业务服务在用户界面的应用程序逻辑的改变
检索相关表的参考信息,并自动维护信息,当用户更改外键值
简化多步骤的自动Web层的状态管理基于Web的业务交易
处理图像,视频,声音和文件,而无需使用代码
待处理的数据跨多个数据视图的变化同步
坚持应用提示,工具提示格式口罩,在任何应用程序和错误消息
任何业务组件定义自定义的元数据支持元数据驱动的用户界面或应用程序的功能
在运行时动态添加属性,简化每行状态管理
支持高功能业务集成的Web服务接口,而无需编写代码
强制执行最佳实践基于接口的编程风格
简化应用程序的安全性自动JAAS集成和审计维护
“编写一次,到处运行”:作为普通的Java类,EJB会话Bean,或Web服务,使用相同的业务服务
分娩后不修改源代码的情况下,延长元件的功能
在全球范围内扩展的替代交付组件,无需修改应用程序
交付应用程序的升级,而不会丢失或手动不必重新下游自定义
ADF业务组件实现的业务服务,通过下面的一组协作组件:
实体对象
实体对象代表一个数据库表中的行,并简化其数据修改为你处理所有的数据操纵语言(DML)操作。它可以封装业务逻辑行,以确保您的业务规则贯彻执行。你联想到一个实体对象与他人反映在基础数据库架构的关系,创建一个业务域对象层在多个应用程序中重用。
查看对象
一个视图对象代表一个SQL查询。您可以使用熟悉SQL语言的全部力量加入,过滤,排序和聚合数据到完全由最终用户任务所需的形状。这包括链接视图对象的能力,与他人创建主任何复杂的细节层次。当最终用户在用户界面中修改数据,视图对象与实体对象始终如一地验证并保存更改。
应用模块
应用模块是事务性组件,UI客户端使用与应用程序数据。它定义了一个可更新的数据模型和顶级程序和相关的功能(称为服务方法)最终用户任务相关的工作的一个逻辑单元。
虽然基本组件处理所有常见的情况下,通过内置行为,定制总是可能的,所提供的基本组件的默认行为可以很容易地覆盖或增强。
ADF业务组件提供了组件实现企业4GL工具提供类似的功能。ADF业务组件中有几个关键组件与其他4GL工具,你可能很熟悉的概念。
ADF业务组件实现了所有的数据中心方面所熟悉Oracle Forms的运行功能,但在某种程度上是独立的用户界面。在Oracle表格,每个表格都包含两个可视对象(如画布,窗,警报和的LOV),以及非可视化的对象(如数据块的关系,并记录组)。个人数据块项目都视觉属性前景色和锥等,以及非可视化的属性,如数据类型和最大长度。即使是不同的事件处理触发形式定义落入可视和非可视类。例如,它的明确的触发像WHEN-BUTTON-PRESSED和WHEN-MOUSE CLICKED的是可视化在本质上,与前端的UI,同时触发像WHEN-VALIDATE-ITEM和ON-INSERT更多相关后端数据处理。合并时,可视和非可视方面的肯定,简化了学习曲线,另一面是,它可以重用复杂。随着清洁分离UI相关的数据相关的元素,这将是更容易没有令人不安的后端业务逻辑和重新设计的用户界面,更容易重新利用多个不同形式的后端业务逻辑。
为了想象这种分离的用户界面和数据,考虑减少的一种形式,因为你知道它仅非可视化的,与数据相关的方面。这减少了数据块的关系,并记录组的容器的形式。这个容器将继续提供的数据块共享一个数据库连接,将负责协调事务提交或回滚。当然,你仍然可以使用非可视化的验证和事务触发器,以增加或更改默认的数据处理行为。你正在考虑这种非可视化的对象是一种“智能数据模型”或通用的应用程序模块,数据和业务逻辑,但没有用户界面元素。这个应用程序模块从任何视觉分离的目标是允许使用任何种类的用户界面,你需要在未来使用它作为数据服务。
焦点片刻数据块将发挥的作用在这个应用程序模块。他们会查询使用SQL数据库中的数据,坐标主/明细关系与其他数据块的行,验证用户数据 输入WHEN-VALIDATE-RECORD WHEN-VALIDATE-ITEM触发器,沟通有效的用户更改回数据库INSERT,UPDATE和DELETE语句,当你提交数据服务的交易。
经验告诉你,你需要进行过滤,加入,秩序,为最终用户和组数据在各种不同的方式,以适应多种不同的任务。另一方面,适用于您的业务领域数据的验证规则,你仍然随着时间的推移,基本上是相同的。鉴于这些意见,这将是真正有用的一次写业务实体验证,并利用它的任何位置一致,在你的应用程序中的用户数据被操纵。
启用这种灵活性,需要进一步“保”你的数据块的功能。你需要一个“SQL查询”对象,代表你的应用程序需要的数据在很多不同的意见,你需要另一种“业务实体”对象执行业务规则和沟通以一致的方式改变基表。通过拆分这样的事情,你可以有多个“视图对象”呈现相同的业务数据,但每个工作用相同的底层“的实体对象与特定的SQL查询。”
Oracle应用开发框架(Oracle ADF)的解决提供准备使用的Java组件实现典型的形式功能的用户界面/数据分割。查询和实体相关的功能之间的责任完全分离,导致更好的重用。
应用模块组件是“数据部分”的形式出现。应用模块是一个智能数据服务,其中包含的的主相关细节查询您的客户端界面需要与数据模型。它还提供了一个事务,它包含的组件使用的数据库连接。它可以包含窗体级的程序和功能,被称为服务方法,被封装在服务实现的。你可以决定这些程序和功能应该是私有的,哪些应该是公开的。
实体对象的组件实现数据块功能“验证和数据库的变化”部分。这个责任的形式运行,进行记录管理。记录管理器是在数据块中的行已经改变了,烧成块级和项目级验证触发适当的时候,和协调保存到数据库的更改,跟踪负责。这正是为你做一个实体对象。实体对象的一个组成部分,代表您的业务领域通过基础数据库表的实体。实体对象给你一个地方来封装业务逻辑验证有关的,违约,该业务对象和数据库修改行为。
ViewObject表现组件执行“数据检索”部分的数据块的功能。每个视图对象封装了一个SQL查询,并在运行时,每个人管理自己的查询结果集。如果您连接两个或两个以上的视图对象主明细关系,这种协调会自动处理。虽然定义一个视图对象,可以链接任何查询列底层的实体对象。捕获此信息,可以合作的视图对象和实体对象自动为您执行您的域名业务逻辑在运行时,无论用户的任务所需的业务数据的“形状”。
如果你已经开发出解决方案,在过去的PeopleTools,你是熟悉与PeopleTools组件结构。ADF业务组件实现PeopleTools你熟悉的数据访问功能。
Oracle ADF的坚持MVC模式和模型与视图分离。页,你是熟悉在PeopleTools组件的,被定义在视图层,使用标准的技术,如JSF和ADF Faces组件的基于Web的应用程序或桌面高保真客户的显示器秋千。
ADF应用程序模块定义的数据结构,就像的PeopleTools组件缓冲区做。通过ADF查询组件生产行的数据集定义主细节之间的关系,可以确保任何应用程序的数据模块,它可以重复使用所需的自然层次,类似于水平滚动组件缓冲区。
你熟悉的组件接口类似,应用程序模块是一个服务对象,提供了标准方法,以及其他开发人员定义的业务逻辑的访问。为了呈现出“无头”的数据服务,为特定的用户界面,组件接口都涉及到用户界面交互的的PeopleTools功能,限制。应用模块是组件的接口,它提供了一个“无头”的数据服务,但相比之下,它并没有这样做包装管窥现有的用户界面相似。相反,应用程序模块设计专门处理业务逻辑和数据访问。组件上,而不是建立一个组件接口,使用ADF业务组件构建的应用程序模块服务是独立的用户界面,然后生成一个或多个页面顶部的这项服务来完成一些终端用户任务您的应用程序。
应用模块是与在同样的方式,的PeopleTools组件缓冲区是一个事务对象。应用模块还提供了一个数据库连接,它包含的组件。任何逻辑关联今天你会定义为逻辑的应用模块ADF业务组件作为组件的PeopleCode,与交易。
在交易中,你今天写的组件记录的PeopleCode或组件记录字段的PeopleCode,记录相关联的逻辑应该不会被定义的应用模块。ADF业务组件视图对象,让更好的重复使用相同的记录时,出现在不同的组件。
总之,PeopleTools使用的组件容器的概念,而ADF业务组件使用的应用模块。这是其中的相似之处。不要想当然地认为你的组件代码将迁移到一个应用模块。首先,理解视图对象的概念,这是实体对象之间的层和应用模块。然后,决定组件代码是适用于应用程序模块,并且是适合的视图对象。
实体对象映射到底层数据结构,就像PeopleTools记录定义映射到基础表或视图。你经常会为每个表,你需要操纵应用程序创建一个实体对象。
类似你如何宣布了一套有效的使用PeopleTools翻译ADF业务组件可以添加声明式验证实体对象的单个属性值,如“客户状态”字段的值。ADF业务组件中的任何逻辑关联的PeopleCode记录或记录字段的PeopleCode今天你写您的应用程序,适用于整个的记录,可以被定义实体对象。
就像一个的PeopleTools行集,视图对象可以填充一个SQL查询。行集不同,视图对象定义可以包含业务逻辑。
你会发现在组件记录的PeopleCode任何逻辑上定义的视图对象是一个可能的候选。组件记录的PeopleCode直接绑到组件,但视图对象可以与不同的应用模块。而您可以使用相同的记录定义许多PeopleTools组件,Oracle ADF的,可以重复使用跨多个应用程序的业务逻辑。
视图对象查询数据完全相同的“形状”,为当前应用程序是非常有用的。许多视图对象可以建立在同一个实体对象的顶部。
您可以定义视图对象之间的关系,以创建主详细结构,就像你找到他们PeopleTools元件在滚动水平。
如果你已经在过去使用Siebel Tools 7.0或更早版本开发的解决方案,你会发现,ADF业务组件实现了所有熟悉的数据访问功能,你都熟悉,与众多增强。
像的Siebel表对象,ADF实体对象的物理特性描述一个单一的表,包括列名和物理数据类型。两个对象包含足够的信息来生成数据定义语言(DDL)语句来创建物理数据库中的表。在ADF业务组件定义实体对象之间的关联,以反映目前在基础表的外键。这些协会允许视图对象所使用的用户界面页自动加入商业信息的查询。ADF业务组件处理列表值(LOV)对象,通过组合数据列的声明实体级验证规则和视图对象的属性级别LOV定义引用。也可以封装其他声明或方案与这些实体对象“表”的处理程序,它会自动在任意视图创建的数据重用的业务逻辑。
像Siebel业务组件,ADF视图对象描述的逻辑映射的底层物理表表示。Siebel业务组件和ADF视图对象允许你提供逻辑字段名,数据和计算领域的需求相匹配的用户界面。与Siebel业务组件,使用ADF视图对象,你可以定义视图对象加入各种基础表的信息。相关ADF视图链接到Siebel链接对象类似,允许您定义主从复合关系。在ADF业务组件视图对象定义的SQL语言可以利用的全部力量,塑造用户界面所需的数据。
Siebel业务对象可以让你定义业务组件的集合。ADF应用程序模块执行类似的任务,允许您创建作为一个“数据模型”一组相关的用户界面页面的主 - 从视图对象的集合。此外,应用模块提供了一个交易和数据库连接上下文,这组数据视图。你可以让多个请求从应用模块,这些参加在同一事务中获得的对象。
如果你已经在过去开发的解决方案与Visual Studio 2003或2005年,你是熟悉与使用ADO.NET数据访问框架。ADF业务组件实现所有你熟悉ADO.NET数据访问功能,与众多增强。
ADO.NET数据集的应用模块组件起着同样的作用。它是一种强类型的服务组件表示行集的集合称为查看对象实例,ADO.NET数据表,这是类似的。应用模块表面公开服务接口,在开发组可配置的视图实例作为SDO的兼容的服务,(可作为一个Web服务,或作为一个SCA复合)的数据行。应用模块与关联交易对象的视图对象执行的SQL查询提供上下文。应用模块还提供了修改保存到数据库中的实体对象,从而起到的作用ADO.NET数据适配器的上下文。
实体对象的组件就像是一个强类型的ADO.NET数据适配器。它代表了一个特定表中的行,并处理找到主键,插入,更新,删除和锁定操作的那些行。ADF业务组件,你没有自己指定这些语句,但如果你需要,你可以覆盖他们。实体对象封装验证或其他相关的基础表中的属性或整个行的业务逻辑。强制执行此验证,由最终用户使用的任何视图对象查询中引用的底层实体对象数据时,修改和保存。ADF业务组件中的一个区别是,随心所欲,灵活的查询SQL语句,视图对象实例级别,但在运行时自动协调的视图对象和实体对象。
视图对象组件封装了一个SQL查询和管理产生的行的集合。它可以与一个相关的实体对象,自动协调由用户所做的修改的那些行的验证和节省。这种合作关系视图对象的查询的数据和一个实体对象的封装业务逻辑提供干净的业务逻辑封装成一个业务域对象层的数据表中的所有的好处。ADO.NET数据表一样,你可以很容易地与一个视图对象的数据作为XML视图对象读取XML数据会自动插入,更新或删除它包含的信息的基础上的行。
JDeveloper包含了全面的设计时支持ADF业务组件。总的来说,这些设施可以让您创建,编辑,图表,测试和重构,业务组件。
当您第一次创建一个组件,你会看到初始化业务组件项目“对话框,如图3-1所示。您可以使用此对话框可以选择设计时应用资源连接使用,同时对您的业务组件工作在这个数据模型项目(ADF业务组件创建的项目在本指南中所使用的术语),或创建一个新的应用程序资源连接复制现有的IDE连接。
由于此对话框出现在你创建你的第一个业务组件之前,你还可以用它在全球范围内控制SQL平台将使用的视图对象制定SQL语句。SQL平台,你可以选择包括:
Oracle SQL的平台,为Oracle数据库连接(默认)
为Oracle Lite数据库的个OLite
微软SQLServer数据库SQLServer的
IBM DB2数据库的DB2
SQL92任何其他支持SQL92标准数据库
注意事项:
如果您打算让您的应用程序对Oracle和非Oracle数据库的运行,你应该选择SQL92的 SQL平台,当你开始建立你的应用程序,而不是后来。虽然这会牺牲一些特定于Oracle的优化使用Oracle SQL平台所固有的,它使应用程序移植到Oracle和非Oracle数据库。
此外,该对话框让你确定这组数据类型,你要使用的数据模型项目。JDeveloper使用的数据类型选择来定义数据类型的属性,当你创建实体对象和视图对象数据模型中的项目。因此,重要的是你做出相应的选择,然后保存初始化业务组件项目“对话框中的设置。该对话框提供以下选项:
Java扩展为Oracle JDeveloper中选择默认情况下,如果检测到您使用的是Oracle数据库的驱动程序类型映射。Java扩展,为Oracle类型映射使用了标准的Java类型和优化类型封装为常见的数据类型oracle.jbo.domain。
提示:
新的融合网络应用程序应该使用默认的Java扩展为Oracle型。
Java类型映射的非Oracle数据库上运行的应用程序提供支持,并为你创建使用SQL92遵守的。在这种情况下,你应该设置数据类型映射到Java的,在全球范围内只使用Java的基本数据类型。
甲骨文域名类型映射提供向后兼容性和ADF应用程序不使用ADF Faces的视图层技术,如3.3.2节中解释,“你可能需要知道关于显示的数值。”时请注意为Oracle迁移与JDeveloper版本11.1.1.4.0或更早版本开发的应用程序,您的应用程序将继续使用甲骨文域名类型映射,并不会改变当前的默认类型映射的Java扩展
一旦你保存初始化业务组件项目“对话框中选择项目,该项目被认为是初始化,您将无法更改数据类型地图选择。初始化项目后,您可以在业务组件“页ADF-config.xml的文件概述编辑器覆盖的SQL平台,但你必须这样做,然后再添加业务组件添加到项目。扩展描述符和ADF META-INF节点,在应用程序资源“窗格中,您可以找到ADF-config.xml文件中。ADF-config.xml的文件中指定的数据库类型,支持生成SQL语句在运行过程中,融合Web应用程序的部署,可以要求实际的数据库类型。
Java扩展的Oracle类型地图和甲骨文的域名类型的地图以不同的方式处理数字数据。当你创建一个新的应用程序的默认类型映射的Java扩展的Oracle数值数据映射到java.math.BigDecimal的类,它继承自java.math.Number。的java.math.BigDecimal的默认匹配的方式融合Web应用程序的视图层,由ADF Faces组件,保留对齐的数字数据(如面临输入字段的网页显示的数值由ADF)。鉴于甲骨文域名类型映射,映射数字数据的oracle.jbo.domain.Number类的,可能不会显示数据,预计通过一定的ADF Faces组件与定位。除了 这个对齐问题,甲骨文域类型映射仍然是一个有效的选择和应用程序,而ADF Faces组件功能没有问题。
在New Gallery ADF业务组件类,JDeveloper提供向导来创建各种业务组件。每个向导允许你指定为新组件和组件的名称,选择到您想组织组件包。如果包不存在,新的组件成为新包装的第一个组件。
精灵会呈现一系列面板,获取必要的信息来创建组件类型。当您单击完成时,JDeveloper创建新的组件保存XML组件定义文件。如果您设置您的Java生成选项,默认情况下,生成类,,JDeveloper还创建初始自定义Java类文件。
一旦存在一个包,在Application Navigator中,您可以快速创建任何类型的其他业务组件包中选择Application Navigator中使用上下文菜单上的图3-2所示的选项之一。
一旦一个业务组件的存在,你可以使用各自介绍访问的编辑器,你可以通过双击的组件在Appilcation导航或选择它并从上下文菜单中选择“ 打开“选项,编辑其属性。
概述编辑器提出了相同的编辑选项,让您在向导中看到,但它可能会安排他们不同。概述编辑器允许您更改任何方面的组件。当你做出改变组件的编辑时,JDeveloper组件的XML组件定义文件更新,如果有必要,任何与其相关的自定义的Java文件。因为概述编辑器是一个JDeveloper编辑器窗口,而不是一个模式对话框,你可以打开并查看概述编辑器,因为很多部件,因为你需要。
作为您的项目定义增加业务组件的数量,您可以决定重构组件改变的关系,你最初创建。为了帮助你理解组件之间的关系数据模型中的项目,在编辑窗口中打开的任何组件,并单击“ 图 “选项卡。在编辑器中的关系图识别元件,以粗体文本编辑。相关组件出现链接文本链接识别组件,您可以点击显示的关系图。例如,图3-3显示“ 图 “选项卡,在编辑器中的视图对象ProductsVO。图中标识实体对象ProductsVO可以访问列表(例如,ProductBaseEO和ProductTranslationEO和所以上),定义相关的视图对象视图对象的关系视图链接(ProductsToWarehouseStockLevels),的相关观点对象(WarehouseStockLevelsVO)命名视图链接。这些相关的组件显示一个链接,您可以在图表标签编辑器,点击打开组件。通过一下相关组件环节,您可以使用图表来浏览你的项目定义组件关系。
JDeveloper提供丰富的UML图表支持ADF业务组件。你可以删除你已经创建了一个业务组件图上它们可视化的组件。您还可以使用图创建和修改组件。图保持同步,你在编辑器中所做的更改。
要创建一个新的业务组件图,使用的业务组件图项目ADF业务组件类的JDeveloper新画廊。这一类是业务层选择的一部分。
一旦你创建了一个应用模块组件,您可以交互式地测试它使用内置的Oracle ADF模型测试仪的。的Oracle ADF模型测试仪的推出,选择应用程序模块在Application Navigator或业务组件图,并选择从上下文菜单中运行或调试。
Oracle ADF模型测试仪的介绍视图对象实例应用模块的数据模型,并允许你使用动态生成的用户界面与他们互动。该工具还提供了一系列的应用程序模块的客户端接口的方法,您可以通过双击应用模块节点交互测试。这个工具是非常宝贵的测试或调试之前和之后都为您的业务服务创建Web页面视图层。
在任何时候,你可以选择在Application Navigator中的一个组成部分,并从上下文菜单中选择“重构”>“重命名”,把这个组件改名。结构窗口还提供组件的详细信息,命名上下文菜单选项,如视图对象的属性或视图的应用模块的数据模型的实例,不显示在Application Navigator中。您也可以在导航器中选择一个或多个组件,通过使用Ctrl +单击,然后从上下文菜单中选择“ 重构“>”移动到一个新的包移动选定的组件。引用旧的组件在当前的数据模型项目的名称或包装自动调整。
使用ADF业务组件,业务服务实现的关键简化的好处之一是一个“积极的数据模型”的行集的应用程序模块的支持。数据模型定义业务对象的特定于应用程序,而该行设置的每个业务对象包含的数据。在应用程序的UI部分,UI组件与这些业务对象进行检索,创建,编辑和删除操作。当您使用ADF业务组件结合ADF模型层和ADF Faces UI组件中,数据模型是“积极的”,因为你的UI组件会自动更新,以反映该行的任何更改设置这些业务对象。
因此,活动的数据模型表示应用技术层之间工作的解决方案,以确保在UI和数据模型中保持同步。
使用一个典型的Java EE业务服务实现,使得客户端开发人员负责:
调用服务的方法来返回数据呈现
跟踪什么数据在客户端创建,删除,或修改
传递到一个或多个不同的服务方法,验证和保存他们的变化
检索,创建,编辑,删除,并保存在应用程序开发过程中的典型顺序执行的任务。因此,ADF应用程序模块代表了一种更聪明,更通用的解决方案。使用应用程序模块,为您的企业服务,您只需绑定客户端的UI组件,如活动视图对象实例的应用程序模块的数据模型中的字段,表和树木。你的网络或移动设备(以及桌面高保真的用户界面,包括窗口和面板使用Swing)在JSP或JSF页面的UI组件,自动更新,以反映任何变化中的行视图对象行集的数据模型。此外,如果您的应用程序模块发生变化的数据模型视图实例定义自定义业务服务方法,这些变化也将被自动反映在UI组件。
在后台,应用模块组件实现了一套通用的服务,使用户能够利用其数据模型在面向服务的架构(SOA)的方法。两个Web服务和UI客户端可以轻松地访问应用程序模块的数据模型,使用简单的API。这些API使您能够搜索和修改应用程序模块提供的任何信息。
当你建立利用ADF模型层的声明性数据绑定的用户界面,您一般不会需要编写客户端代码。活动数据模型支持声明的UI组件绑定在您的网页中查看对象的数据模型,并定制业务服务方法。此外,当您创建Web服务在SOA环境中,他们可以绑定声明的数据模型,通过数据模型的Web服务接口。
如果没有一个有效的数据模型,你就需要编写更多的代码在客户端或Web服务来处理简单,日常的CRUD式操作。此外,为了保持页面,你会需要管理的“刷新标志”,要求“重新请求”的数据业务服务,以反映可能已被修改的数据线索控制器层。当使用ADF应用程序模块来实现业务服务,你可以专注于手头的业务逻辑,而不是让您的商务工作,您的最终用户所期望的水暖。
考虑以下三个简单的,具体的活动数据模型的例子:
新的数据出现在相关的显示器,无需重新查询
一位顾客登录进入融合承演示应用程序和显示购物车中的项目的列表。然后,如果客户访问某些产品页面并创建一个新的订单项目,当他返回到显示他的购物车,新的项目会出现在他们的名单,而不需要重新查询数据库应用程序。
业务领域逻辑所引起的变化自动反映
后台办公应用程序会导致订单状态更新。业务逻辑封装在订单业务领域层的实体对象包含一个简单的规则,每当订单状态属性被改变更新的最后更新日期。用户界面更新,自动反映业务领域层中的逻辑改变的最后更新日期。
ADF模型层的结合重新查询数据业务服务方法的调用和设置当前行
在一棵树显示,用户点击特定节点上的一棵树。这一行动声明的业务服务方法调用由ADF树的结合您的应用程序模块重新查询主的详细信息,并设置当前行的行集的相应行。显示更新以反映新的主详细数据,并显示当前行。
因为应用程序模块支持活动的数据模型,客户端用户界面将保持最新。这意味着你将不再需要编写的代码在客户端,是关系到设立或操纵数据模型。
另一种典型类型的客户端代码不再有写使用ADF业务组件是代码,协调详细的数据收集时,一排在主的变化。通过连接视图对象,你可以自动为您进行协调。
然而,当你需要编写自定义代码,这些代码封装内自定义您的应用程序模块组件的方法。例如,每当操纵视图对象的编程代码,是一个合乎逻辑的实施完整的业务服务功能方面,你应该写一个自定义的方法,在你的应用程序模块的Java类的细节封装起来。这包括,但不限于,代码是:
配置视图对象属性查询显示正确的数据
遍历视图对象行返回一个总的计算
执行任何一种多步程序逻辑与一个或多个视图对象
通过集中这些在您的应用程序模块的实现细节,您将获得以下好处:
你让你的代码的意图更加清晰的客户。
你允许多个客户端页面,方便地调用相同的代码,如果需要的话。
您简化您的完整的业务服务功能的回归测试。
你保持开放,以改善您的执行,而不影响客户的选择。
你在你的页面调用业务逻辑功能启用声明。
在你开始实施具体的ADF业务组件,它是一个好主意,有一些熟悉使用ADF业务组件设计和实现。
是所有Oracle ADF技术的情况下,ADF业务组件是用Java实现。测试工作,提供通用的框架组件,元数据驱动的功能,从丰富的健壮的代码层。ADF业务组件遵循Java EE社会的最佳实践的使用完全分离的XML文件来存储元数据,定义配置每个组件的运行时行为。
由于ADF业务组件通常用于关键业务应用,重要的是要了解Oracle ADF的,包括ADF业务组件,是完整的源代码可支持客户通过Oracle全球支持。Oracle ADF的完整的源代码可以是一个重要的工具,以帮助您诊断问题,如在第36.8节,“使用ADF声明调试。”工作与Oracle ADF的完整的源代码,还可以帮助您了解如何正确延长基本框架的功能,以满足您的需要,在第12.3节的描述,“自定义扩展类的框架的行为。”
使用ADF业务组件构建的应用程序可以运行在任何支持Java的应用服务器,包括任何Java EE兼容的应用服务器。由于业务组件是使用普通的Java类和XML文件,你可以用它们在任何一个Java虚拟机运行时环境存在。这意味着,使用ADF业务组件构建的服务易于使用的内外Java EE服务器 - 被称为“容器”您的应用程序在运行时 - 内外。
客户经常使用的应用模块等不同配置,如命令行批处理程序,Web服务,定制的Servlet,JSP页面,桌面高保真客户的建成使用Swing。
您也可以构建应用程序与非Oracle数据库,第3.3.1节中所描述的,“选择一个连接,SQL平台,数据类型地图的工作。“然而,应用程序,目标Oracle数据库会发现无数的优化建成ADF业务组件。
ADF业务组件实现所有流行的Java EE设计模式,你通常会需要理解,实施和调试自己创造一个真实世界的企业Java EE应用程序。如果对你很重要交叉引用从Java EE规范与他们的ADF业务组件同行的这些设计模式的名字,你可以参考附录E“ADF业务组件的Java EE设计模式目录”。
由于ADF业务组件是用Java实现的,它的类和接口组织成包。Java包确定开发人员使用安排的分层命名结构的代码转换成由点分隔的名字。
ADF业务组件提供的源代码驻留在oracle.jbo包和众多的子包的类和接口组成。然而,在每天的日常工作使用ADF业务组件,你会通常在这两个关键软件包的类和接口:
oracle.jbo包,它包含了所有的接口是专为业务服务客户端的工作
oracle.jbo.server包,其中包含了实现这些接口的类
注意事项:
这里的长期客户是指在访问应用程序模块组件为业务服务模型,视图,控制器层中的任何代码。
图3-4示出的具体实例的应用程序模块组件。客户端应用程序模块的接口是ApplicationModule接口在oracle.jbo包装。这个接口定义了名称和签名方法与应用模块工作时,客户端可以使用,但它不包括任何有关该功能的实施细节。驻留在oracle.jbo.server包中的类,它实现的基本功能应用模块组件和名为ApplicationModuleImpl。
由于ADF业务组件是用Java实现的应用程序组件(包括他们的类,接口和元数据文件)也将被组织成包。
为了确保您的组件将不会来自其他组织的冲突,可重复使用的组件,选择与您的组织的名称或网站域名开头的包名。因此,例如,Apache组织的Tomcat Web服务器相关的包名选择org.apache.tomcat的,而甲骨文挑oracle.xml.parser作为一个包的名字为它的XML解析器。组件创建自己的应用程序可能驻留在与COM。已由YourCompany名字,如包。:这些yourapp和subpackages。
作为一个具体的例子,ADF业务组件,弥补主营业务的融合订单演示应用程序被组织成的oracle.fodemo.storefront包及其子包。如图3-5中所示,这些组件StoreFrontModule应用程序驻留在StoreFrontService项目,大致如下组织:
oracle.fodemo.storefront.account.queries包含在客户登记过程中使用的视图对象
oracle.fodemo.storefront.client包含测试客户端的。java文件
oracle.fodemo.storefront.entities包含实体对象
oracle.fodemo.storefront.lookups包含静态数据视图对象和LookupServiceAM的共享应用模块
oracle.fodemo.storefront.store.queries包含用于管理店面的视图对象
oracle.fodemo.storefront.store.service包含了StoreServiceAM的应用模块
在自己的应用程序,你可以选择任何包的组织,您认为最好的。尤其是,要记住,你是不是限制举办同类型的组件成一个单一的软件包。
JDeveloper支持组件重构,你可以轻松地重命名组件,在任何时候,或将它们移动到不同的包。这种灵活性使您很容易地整合到应用程序中的不可避免的变化,您的应用程序的发展。
包中有没有最佳的元件数量。然而,随着经验的积累,你会意识到,你的团队的最佳结构介于两个极端之间,在单一封装中的所有组件,每个组件放置在其自己的,独立包装。
有一点要考虑的是,该项目是JDeveloper支持其他数据模型项目的重用粒度单位。所以,你可能会考虑到这个因素,你如何选择组织组件。如需了解更多信息,请参阅第38.3节,“一个可重复使用ADF组件打包成一个ADF图书馆。”
每一种组件ADF业务组件带有内置运行时通过声明设置功能,您控制。这些设置都保存在一个XML组件定义文件具有相同名称的组件,它代表。当你需要编写自定义代码的一个组成部分,例如,以增加组件的行为,您可以启用可选的自定义Java类中的组件。图3-6显示了如何在Application Navigator显示XML组件定义和可选的自定义Java类的应用程序模块。
图3-7说明了XML组件定义文件,就像一个应用模块中创建一个包名为COM。yourcompany.yourapp的名为YourService的特定于应用程序的组成部分。相应的XML组件定义驻留在。/ COM / 自己公司/ yourapp的的数据模型项目的源路径根目录的子目录。该XML文件记录的名称的Java类,它应该使用在运行时提供的应用模块实现。在这种情况下,XML记录提供的基oracle.jbo.server.ApplicationModuleImpl类的名称的由Oracle ADF。
使用时无需定制,你的组件是完全定义XML组件定义,这将是完全没有自定义Java代码甚至是一个Java类文件的组件功能。如果你没有需要延长内置ADF业务组件中的一个组件,在功能,无需编写任何自定义代码来处理其内置的事件,您可以使用该组件在这个XML唯一的时尚。
当你需要添加自定义代码来扩展一个组件的基本功能或处理事件时,您可以启用自定义Java类任何您创建ADF业务组件的主要类型。启用其各自概述编辑在JDeveloper Java页面上的一个组件生成自定义类。当您启用此选项时,JDeveloper创建一个Java源文件的自定义类相关的组件,其名称如下配置的命名标准。这节课,他的名字被记录在该组件的XML组件定义,提供了一个地方,你可以编写自定义该组件所需要的Java代码。一旦你启用了自定义Java类的一个组件,你可以浏览到使用相应的围棋 ComponentName在 类在组件的应用程序导航器上下文菜单选项。
图3-8说明应用模块YourService启用自定义Java类时,会发生什么。à YourServiceImpl的 Java源代码文件中创建相同组件的XML组件定义文件的源路径目录。的YourServiceImpl XML文件被更新,以反映这一事实,在运行时组件应该使用COM yourcompany.yourapp.YourServiceImpl类而不是基地ApplicationModuleImpl类的。
注意事项:
本指南中的例子使用默认设置生成的名称,自定义组件的类和接口。如果你想更改这些默认设置自己的应用程序,使用ADF业务组件:JDeveloper中的“首选项”对话框中的类的命名页面。您所做的变更仅影响新创建的组件。
Java语言提供了大量的内置数据类型处理字符串,日期,数字和其他数据。使用ADF业务组件工作时,你可以使用这些类型,但默认情况下,你会使用优化的类型集合在oracle.jbo.domain和oracle.ord.im包。这些类型,如表3-1所示,允许数据从Oracle数据库访问,留在其原生的,内部格式。您将获得更好的性能,使用ADF业务组件提供优化的数据类型,避免昂贵的类型转换时,他们是没有必要的。
有两种情况,一个优化的数据类型不使用默认情况下,和Java的内置数据类型用来代替。要基于字符串的数据,ADF业务组件默认情况下,使用常规的java.lang.String类型。此外,与数字数据,默认情况下,ADF业务组件使用的java.math.BigDecimal的类型,格式的数字的方式,是由ADF对齐预期一致Faces组件。为了向后兼容,以及不使用ADF Faces组件的应用,优化的数据类型oracle.jbo.domain.Number在以前的版本中提供仍然是一个替代数字数据的数据类型。
表3-1基本数据类型的oracle.jbo.domain和oracle.ord.im包
数据类型 | 包 | 代表 |
---|---|---|
数(默认情况下不使用) |
oracle.jbo.domain |
不限数值数据。默认情况下,ADF业务组件使用的的java.math.BigDecimal的类型,以支持由ADF Faces组件对齐预期数值格式。java.math.BigDecimal的类型时,应使用ADF Faces是选择的视图层技术。 |
日 |
oracle.jbo.domain |
可选的时间日期 |
DBSequence |
oracle.jbo.domain |
连续整数分配一个数据库触发器 |
ROWID |
oracle.jbo.domain |
Oracle数据库的ROWID |
时间戳 |
oracle.jbo.domain |
TIMESTAMP值 |
TimestampTZ |
oracle.jbo.domain |
时间戳值时区信息 |
TimestampLTZ |
oracle.jbo.domain |
JavaVM的或从ADF上下文检索,在应用程序的ADF-config.xml中配置一个EL表达式时,与当地的时区信息的时间戳值: <用户时区配置的xmlns = “http://xmlns.oracle.com/adf/usertimezone/config”> <user-timezone expression= "EL exp" /> </用户的时区配置> EL表达式将被评估,以确定当前用户的时区,否则,该值默认为JavaVM的时区。 |
BFileDomain |
oracle.jbo.domain |
二进制文件(BFILE),对象 |
BlobDomain |
oracle.jbo.domain |
二进制大对象(BLOB) |
ClobDomain |
oracle.jbo.domain |
字符大对象(CLOB) |
OrdImageDomain |
oracle.ord.im |
甲骨文跨媒体图片(的ORDImage) |
OrdAudioDomain |
oracle.ord.im |
甲骨文跨媒体音频(ORDAUDIO) |
OrdVideoDomain |
oracle.ord.im |
甲骨文跨媒体视频(ORDVIDEO) |
OrdDocDomain |
oracle.ord.im |
的Oracle:跨媒体文件(ORDDOC) |
结构 |
oracle.jbo.domain |
用户定义的对象类型 |
排列 |
oracle.jbo.domain |
用户定义的集合类型(如VARRAY) |
注意事项:
如果你不使用ADF Faces的视图层技术,您可以使用java.math.BigDecimal的的类型或oracle.jbo.domain.Number类型。然而,要知道,的oracle.jbo.domain.Number类java.lang.Number的内置的类型具有相同的类名。由于Java编译器隐式地导入java.lang中*到每一个类,你会需要,引用它到任何类,明确导入oracle.jbo.domain.Number类。通常情况下,JDeveloper将遵循这一做法为你,但如果你收到相关的编译器或运行时错误“号是一个抽象类,”这意味着你正在使用java.lang.Number的,而不是oracle.jbo.domain.Number。添加:
进口oracle.jbo.domain.Number;
在你的类的顶部的线,包线后,可以防止这些类型的错误。
与应用模块,视图对象和实体对象的工作时,你可以选择使用一套通用的API或启用一个强类型的API,组件,你可以有JDeveloper中生成的代码到一个自定义的Java类。工作时,一个视图对象,例如,如果你想访问某个属性的值,其结果在任何行,通用的API将看起来像这样:
排排= ordersVO.getCurrentRow(); 日期发货日期(日期)row.getAttribute(“OrderShippedDate);
请注意,使用通用的API,你通过存取的参数的字符串名称,你必须把返回类型预期的类型,如日期的例子所示。
另外,当您启用了强类型样式的工作可以这样写代码:
OrdersRow的行=(OrdersRow)ordersVO.getCurrentRow(); 日期发货日期= row.getOrderShippedDate();
在这种情况下,你的工作与生成的方法名,其返回类型是已知的在编译时,而不是通过字符串名称和投结果。通常情况下,它是需要使用强类型的访问,当你需要从业务逻辑代码中调用的方法,在不牺牲编译时的安全。这也可能是有用的,当你正在编写自定义验证逻辑setter方法,虽然在这种情况下,你可能要考虑使用Groovy表达式,而不是生成实体和视图行业务组件实现类。后续章节将介绍如何启用此强类型生成Java类的业务逻辑,如果你选择使用Java实现的工作作风。
只有这些业务服务组件的客户端可见的:
应用模块,服务本身
查看对象,代表查询组件
查看行,每一行代表在给定的查询组件的业绩
在经营服务实体对象实施故意不设计由客户直接引用。相反,客户的工作数据查询视图对象作为一个应用模块的数据模型的一部分。在幕后,视图对象与业务服务层的实体对象自动合作,协调验证和保存数据的用户更改。对于这种运行交互的更多信息,请参见6.3.9节,“在运行时会发生什么情况:如何查看对象和实体对象合作。”
的Java接口的oracle.jbo包的提供客户端访问的API,为您的企业服务。这个包故意不包含实体介面,或将允许用户端直接与实体对象的任何方法。相反,客户端代码与接口,如:
的ApplicationModule,工作与应用模块
ViewObject表现,工作的视图对象
行,工作与行
当你开始添加自定义代码到您的ADF业务组件,您希望客户端能够调用,你可以在“发布”该功能的客户端的任何客户端可见的组件。对于每一个组件,出版至少有一个自定义的方法,它的客户端界面上的客户端,JDeveloper自动维护相关的Java接口文件。因此,假设您正在使用的应用模块,如在融合承演示应用程序StoreServiceAM,你可以自定义接口,如:
自定义应用程序模块的接口
StoreServiceAM延长ApplicationModule的
自定义视图对象接口
OrderItemsInfo延伸ViewObject表现
自定义视图的行界面
OrderItemsInfoRowClient扩展行
然后,客户端代码可以投之一的通用客户端接口,包括组选定的客户端访问您所选择的方法为您的特定组件更为具体的一个。
Groovy是一种脚本语言,Java平台类似Java语法。ADF业务组件的Groovy语言表达不同的Java代码中可以使用的业务组件自定义Java类。Groovy脚本语言简化了编写代码,采用点分隔的符号,但仍然支持语法操纵集合,字符串,和JavaBeans。Groovy表达式,类型检查是在运行时完成,而在Java中,类型检查是在编译时完成。此外,由于动态编译的Groovy表达式,它们存储在XML定义文件,在你使用它的业务组件。
ADF业务组件支持地方访问实体对象,查看对象属性是有用的,包括属性验证器(实体对象),属性的默认值(对于任何一个实体对象或视图对象),瞬态属性值中使用Groovy脚本语言计算(无论是实体对象或视图对象),绑定变量的默认值(在视图对象的查询报表和视图的标准过滤器),和错误的消息(在实体对象验证规则)的占位符。此外,ADF业务组件提供了一组有限的内置关键字,可以用来在Groovy表达式。
具体来说,ADF业务组件框架支持的使用Groovy语言表达的,执行以下任务:
定义一个脚本表达式验证器或比较验证器(见第7.5节“使用Groovy表达式验证和业务规则”)
定义错误消息处理验证失败的令牌(参见7.7.4节,“如何嵌入一个Groovy表达错误消息”)
执行验证程序处理条件(参见7.7.3节,“如何有条件地提高使用Groovy的错误消息”)
在视图对象的查询语句设置绑定变量的默认值(见第5.10节“使用绑定变量”)
设置绑定变量的默认值,指定视图中的条件语句(见第5.11节“命名的视图标准”)标准项目。
定义一个实体对象属性的默认值,并可选重新计算条件(见4.10.6节,“如何定义一个静态默认值”)
确定一个短暂的属性值的实体对象或视图对象(见第4.11节“瞬态和计算的属性添加到一个实体对象”和第5.14,“添加计算和瞬态属性视图对象”)
在JDeveloper中要执行这些任务,您可以使用特定任务的表达式编辑器对话框。例如,当您要创建一个短暂的视图对象属性的默认值,则使用属性的编辑表达式编辑器“对话框中输入一个表达式,确定一个运行时的属性值。相同的对话框,也可以让你指定的值时,应计算(称为重新计算条件),如图3-9所示。
此外,概述编辑器,你用它来 编辑实体对象和视图对象显示业务规则“页面,在这里你可以查看和编辑所有表达式由一个单一的业务组件使用。例如,业务规则页面显示视图对象可以让你查看所有表达式视图对象上使用其视图的访问,绑定变量,和属性。您可以过滤显示只显示这些项目的Groovy表达式定义,如图3-10所示。尽管表达式不能在设计时验证,所有表达式编辑器让您测试表达式语法之前,您将它保存。
Groovy语言的更多信息,请参阅下列网站:
http://groovy.codehaus.org/
有一个名为ADF顶层对象使您可以访问的对象,该框架提供Groovy脚本。当你引用的Oracle ADF对象在Groovy的表达,在Oracle ADF运行时返回包装对象,不符合实际的具体类型的类。这些包装对象支持所有的方法和字段类型的包装对象。你的表达式可以使用包装的对象,好像他们是实际的对象。但是,请注意,任何尝试投打包,对象,其具体类型将失败与时抛出。在一般情况下,当工作与Groovy语言,它是没有必要使用显式转换,这些包裹ADF业务组件对象的情况下,这样做会导致异常。
访问Oracle ADF的对象包括以下内容:
adf.context -引用ADFContext对象
adf.object -引用对象,在该对象上的表达(也可以使用关键字对象引用,没有ADF前缀)被应用。其他访问成员的名字来从Groovy脚本应用的上下文中。
实体对象的属性:上下文是一个实体实现类的实例。你可以通过这个对象引用自定义的自定义实体的实现类,基实现类中定义的任何方法的的JavaDoc EntityImpl的指定方法,你可以参考实体实例的属性。
实体对象脚本验证规则:上下文校验器对象(JboValidatorContext)的合并与实体验证器应用。在这种情况下,您可以使用关键字的详细信息,请参阅第3.6.2.1节,“引用相同的业务组件的成员。”
查看对象的属性:上下文视图行实现类的一个实例。通过这个对象,可以自定义视图行实现类,基实现类中定义的任何方法的的JavaDocViewRowImpl的指定引用自定义的方法,你可以参考属性所定义的查询行的行实例设置。
绑定变量视图对象:上下文变量对象本身不是视图的行。您可以参考的的属性访问structureDef其他信息,以及ViewObject表现属性访问视图绑定变量参与的对象,其中。然而,进入查看对象的属性不支持。
绑定变量,在视图的访问上下文是当前视图的行。使用绑定变量的视图访问创建级联值列表(LOV)。视图访问Groovy的驱动值,从目前来看排用来制定有效选项的列表视图访问视图对象。
瞬态属性:上下文是当前实体或视图的行。该实体或视图的行上,你可以参考属性名称属性出现在实体或视图的行,以及公共方法。要对当前对象的访问方法,则必须使用对象关键字来引用当前对象(例如,object.methodName() )。相当于这个关键字在Java 对象关键字。如果没有它,在短暂的表达式中,该方法将被假定为存在对动态编译的的Groovy脚本对象本身。
adf.error -验证规则,要访问的错误处理程序,允许验证表达式生成异常或警告
adf.userSession -返回一个引用ADF业务组件用户会话(userData的 HashMap的是会话的一部分,您可以使用参考值)
您也可以参考当前日期时间截断或使用下列表达式的当前日期和时间:
adf.currentDate
adf.currentDateTime
Groovy脚本语言,简化了编写代码,你可能写访问你的实体对象和视图对象的方法和属性。
引用的业务构件,包括实体对象和视图对象定义的方法和属性,最简单的例子是引用存在于同一个实体对象的属性,或查看对象的属性,你应用的表达。
例如,你可以定义一个Groovy表达式来计算一个瞬态属性AnnualSalary的价值实体对象与属性萨尔指定雇员的月薪:
萨尔* 12
或者,用Groovy你可以写一个简单的验证规则的属性比较单一视图对象,使用类似的语法:
PromotionDate> HIREDATE
相同的比较使用Java中,这看起来像这样:
((日期)的getAttribute(“PromotionDate”))的compareTo(日期的getAttribute(的“HIREDATE”))> 0
需要注意的是当前对象,通过这个对象的脚本,所以你可以通过简单地使用属性名引用当前对象中的属性。例如,在属性级别或实体级脚本表达式验证器,请参阅一个属性名为“HIREDATE”,该脚本可以简单地引用雇用日期。
引用属性类似,当你定义在一个实体中实现类的自定义方法,你可以调用这些方法,你的表情的一部分。例如,要定义一个属性的默认值:
(adf.object.getDefaultSalaryForGrade)
一种方法参考需要前 缀adf.object的,它允许你引用同一个实体定义的属性表达。此相同的前缀,也可以让您引用 实体实现类(EntityImpl.java),您的自定义实现类扩展的基类的方法。
请注意,当你想在验证规则的一个实体实现类的引用的方法,您可以使用源前缀:
(source.getDefaultSalaryForGrade)
源前缀的使用是必要的验证器,因为对象关键字意味着验证规则的对象,而不是实体对象(定义方法)。
为了让您能够引用的验证对象(JboValidatorContext“ )的成员,你可以使用这些关键字,您的验证规则表达式:
NEWVALUE:在属性级别的验证,访问属性值被设置
OLDVALUE:在属性级别的验证,访问被设置的属性的当前值
例如,您可以使用下面的表达式指定一个动态的验证规则检查一个推销员的工资。
(招聘==“推销员”) { 返回NEWVALUE <source.getMaxSalaryForGrade(招聘) } 其他 返回true
您也可以参考实体对象和视图对象的方法和属性,表达您适用于不同的实体对象的属性或验证规则定义。这是通过引用访问器中的实体关联。
例如,如果你定义一个实体的主部和EMP细节协会,默认情况下,实体关联的存取将被命名为部和EMP,源和目标数据源的身份。一个Groovy表达式中使用,存取新员工的工资根据各自部门的位置上设置默认值:
adf.object.getDefaultSalaryForGrade(Dept.Loc)
这个表达式不引用的实体,即使它有相同的名称(系)为协会的存取。相反,假设一个部门和雇员之间的主从关系,引用存取允许为员工实体对象的Groovy表达式往回走主部门实体,并通过从该主的价值禄。
您可以使用下面的内置聚合函数Oracle商务组件的RowSet对象:
rowSetAttr总和(GroovyExpr)
rowSetAttr数(GroovyExpr)
rowSetAttr平均(GroovyExpr)
rowSetAttr分钟(GroovyExpr)
rowSetAttr最大(GroovyExpr)
这些聚集函数接受一个字符串值设置为计算的总的行中的每一行的背景下,一个Groovy表达式,该表达式被解释为参数。该的Groovy表达式必须返回一个数值(或数域)。
例如,在一个部门实体对象,你可以添加一个短暂的属性,显示所有雇员工资的总和,通过以下公式计算:
EmployeesInDept.sum(“萨尔”)
要引用一个特定部门的员工,表达提供主从关联的存取目的地EMP实体的名称。在这种情况下,访问者是EmployeesInDept的工资被解释为每个记录EMP实体对象。
或者,假设您想要具体部门,包括每个员工的福利待遇,随工作角色的工资总额计算:
EmployeesInDept.sum(“萨尔+ adf.object.getBenefitsValue(工作)”)