处事数据工具简介
当前位置:以往代写 > JAVA 教程 >处事数据工具简介
2019-06-14

处事数据工具简介

处事数据工具简介

副标题#e#

简朴地说,SDO是一种数据应用措施开拓框架,它包罗一个别系布局和相应的 API。SDO 可以或许实现以下操纵:

简化 J2EE 数据编程模子。

抽象面向处事体系布局(SOA)中的数据。

统一数据应用措施的开拓。

支持和集成 XML。

团结 J2EE 模式和最佳实践。

在这篇先容 SDO 框架的文章中,我们将实验着表明 SDO 背后的念头,以及 SDO 与其他类型的区别,然后描写 SDO 的构成,最后,通过一个示例 SDO 应用 措施说明 SDO 的用法。

为什么要利用 SDO?

对付处事数据工具(SDO),大大都开拓人员要问的第一个问题就是为什么要 利用 SDO。莫非 J2EE 自己还不足复杂、不足巨大(并且难以把握)吗?Java 情况中不是已经有其他支持 XML 的框架了吗?所幸的是,该问题的谜底可以或许让 我们大都人感想满足:SDO 是作为简化 J2EE 数据编程模子的要领呈现的,它能 够让 J2EE 开拓人员把更多的时间用于应用措施的业务逻辑。

处事数据工具框架为数据应用措施开拓提供了统一的框架。通过 SDO,您不 需要熟悉特定于技能的 API,就能会见和操作数据。您只需要知道一种 API,即 SDO API,它答允您处理惩罚来自多种数据源的数据,个中包罗干系数据库、实体 EJB 组件、XML 页面、Web 处事、Java Connector Architecture、JavaServer Pages 页面等。

留意,我们利用了 框架这一词。这是比照 Eclipse 框架的说法。由于设计 的基本健壮并且可以扩展,所以 Eclipse 可以或许集成各类东西。与此雷同,对付 回收 SDO 的应用措施,SDO 也是一种框架,这类应用措施在 SDO 模子上是一致 的。

与其他某些数据集成模子差异的是,SDO 没有逗留在数据抽象上。SDO 框架 还团结了许多 J2EE 模式和最佳实践,从而使应用措施很容易团结颠末验证的体 系布局和设计。例如说,本日的大都 Web 应用措施百分之百的时间没有(或不 能)毗连到后端系统,因此 SDO 支持不毗连的编程模子。同样的,本日的应用 措施往往很是巨大,包括许多条理。如何存储数据、如何发送数据、如安在 GUI 框架中将它们提供应终端用户?SDO 编程模子提供的应用模式可以或许清晰地分别不 同的问题。

XML 在漫衍式应用措施中日渐普及。好比,XML Schema (XSD) 被用来界说应 用措施数据名目中的业务法则。XML 自己也可以用于改造交互性:Web 处事利用 基于 XML 的 SOAP 作为动静名目。XML 是敦促 SDO 的一个重要原因,SDO 框架 支持并集成了 XML。

各类技能的较量

前面已经提到,SDO 并不是 提出办理漫衍式应用措施中数据集成问题的惟一技能。下面将别离接头 SDO 和 雷同的编程框架 JDO、JAXB 和 EMF 的黑白。

SDO 和 WDO

Web 数 据工具(或 WDO)是跟着 IBM WebSphere® Application Server 5.1 和 IBM WebSphere Studio Application Developer 5.1.2 宣布的 SDO 早期版本的 名称。假如利用过 WebSphere Studio 5.1.2,那么您对 SDO 大概已经有所相识 ,固然您大概习惯看到将它标志为 WDO,好比在数据库的名字中。忘掉 WDO 吧 ,它此刻的名字是 SDO!

SDO 和 JDO

JDO 代表 Java Data Object(Java 数据工具)。JDO 已经通过 Java 社区历程(JCP)尺度化了 1.0 版,2003 年 5 月推出了维护版 1.0.1,此刻已经为 2.0 版创立了 JCP 专家组 。JDO 针对 Java 情况中的数据编程提供了一种通用 API,用于会见存储在差异 数据源中的数据,如数据库、文件系统可能事务处理惩罚系统。JDO 保持了 Java 对 象(图)之间的干系,同时答允对数据的并发会见。

JDO 但愿简化和统 一 Java 数据编程,以便开拓人员可以或许专注于业务逻辑,而不是底层的技能,从 这一点上说,其方针和 SDO 是沟通的。但主要的区别在于,JDO 仅思量耐久性 问题(J2EE 数据层可能企业信息系统(EIS)层),而 SDO 更具一般性,存眷 的是差异 J2EE 条理间数据流的暗示,好比暗示层和业务层。

有趣的是 ,SDO 可以团结 JDO 一起利用,JDO 作为数据源,SDO 来会见它,这就是 Data Transfer Object(数据传输工具,DTO)设计模式的详细运用。同样,SDO 也可 以团结实体 EJB 组件和 Java Connector Architecture(Java 毗连器体系布局 ,JCA)利用,目标是提供统一的数据会见。

SDO 和 EMF

EMF 代表 Eclipse Modeling Framework(Eclipse 建模框架)。EMF 按照使 用 Java 接口、XML Schema 可能 UML 类图界说的数据模子生成统一的元模子( 称为 Ecore),可以将元模子与框架团结在一起利用,建设高质量的模子实现。 EMF 提供了耐久性、一个有效的反射类属工具哄骗 API 和一个改观通知框架。 EMF 还包罗用来构建 EMF 模子编辑器的一般的重用类。

#p#分页标题#e#

EMF 和 SDO 都可以处理惩罚数据暗示。事实上,IBM 的 SDO 参考实现就是一种 SDO 的 EMF 实现,后头我们还要用到该实现。还可以按照 UML 模子界说可能 SDO 自己,用 EMF 代码生成来建设 SDO 实现的某些部门。SDO 实现根基上是 EMF 中的一小层(方面),它是作为 EMF 项目标一部门打包和提供的。关于 EMF 的更多信息,请参阅 参考资料。


#p#副标题#e#

SDO 和 JAXB

JAXB 代表 Java API for XML Data Binding(XML 数据绑定 Java API)。 JAXB 1.0 在 2003 年 1 月由 JCP 宣布。JCP 专家组已经拟定了 2.0 版的劈头 草案。JAXB 是关于 XML 数据绑定的,也就是说,将 XML 数据暗示成内存中的 Java 工具。作为 Java 语言的 XML 绑定框架,JAXB 可以节省理会和建设 XML 文档的时间。(事实上,通过它,您完全不需要和 XML 打交道。)JAXB 为您执 行编组/序列化(Java 到 XML)息争组/并行化(XML 到 Java)。

SDO 界说了本身的 Java 绑定框架,可是走得还要远一些。JAXB 仅存眷 Java 到 XML 的绑定,而绑定到 SDO 的不只仅是 XML 数据。如前所述,SDO 提 供了对差异范例数据的统一会见,XML 仅是个中的一种数据范例。SDO 还提供了 静态和动态 API *,而 JAXB 仅提供了静态绑定。

* 留意,本文中示例应用措施仅利用了动态 SDO,固然 EMF 代码生成器也为 数据工具的静态代码生成提供了完整的支持。

SDO 和 ADO .NET

ADO 代表 ActiveX Data Objects(ActiveX 数据工具),可是在 .NET 上下 文中,其寄义已经产生了变革。ADO .NET 提供了 .NET 框架下差异条理间的统 一数据会识趣制。

ADO .NET 和 SDO 具有沟通的念头,都是用来支持 XML 和漫衍在多个层上的 应用措施。除了技能性的差别外,这两项技能主要的差异在于:ADO .NET 用于 Microsoft .NET 平台,是一种私有的技能;而 SDO 用于 Java (J2EE) 平台, 通过 Java 社区历程实现尺度化。

SDO 的构成部门

这一节将先容 SDO 的体系布局。我们将先容构成框架的差异构成部门和它们 之间的协作。首先要接头的三个构成部门之一是 SDO 的“观念性”特征,API 中没有对应的接口。

SDO 客户机

SDO 客户机利用 SDO 框架处理惩罚数据。SDO 客户机利用的不是特定于技能的 API 和框架,而是 SDO 编程模子和 API。SDO 客户机处理惩罚 SDO 数据图(拜见 图 1),不需要相识所处理惩罚的数据是如何耐久生存可能序列化的。

Data 中介处事

数据中介处事(DMS)认真从数据源建设数据图、依据数据图的变革更新数据 源。数据中介框架不属于 SDO 1.0 类型,换句话说,SDO 1.0 没有涉及详细的 DMS。常见的 DMS 有 JDBC DMS、实体 EJB DMS 和 XML DMS 等。

数据源

数据源不限于后端数据源(如耐久存储数据库)。数据源以本身的名目生存 数据。只有 DMS 会见数据源,SDO 应用措施不会见数据源。SDO 应用措施大概 只利用数据图中的数据工具。

下面先容的每个组件对应于 SDO 编程模子的一个 Java 接口。SDO 参考实现 (请参阅 参考资料)提供了这些接口基于 EMF 的实现。

数据工具

数据工具是 SDO 的根基组件。事实上,它们是类型名称中的 处事数据工具 。数据工具是布局化数据的 SDO 暗示。数据工具是通用的,它们提供了 DMS 创 建的布局化数据的民众视图。例如说,固然 JDBC DMS 需要知道耐久性技能(比 如干系数据库),以及如何设置和会见数据,SDO 客户机不需要相识这些细节。 数据工具在属性中生存它们的“数据”(稍后还要接头属性)。数据工具提供了 易于利用的建设和删除要领(带有差异签名的 createDataObject() 和 delete () ),得到自身范例(实例类、名称、属性和名称空间)的反射要领。数据对 象都链接在一起,包括在数据图中。

数据图

数据图提供了数据工具树的容器。数据图由 DMS 生成,供 SDO 客户机利用 。修改后,数据图被回传给 DMS 更新数据源。SDO 客户机可以遍历数据图,读 取和修改数据图中的数据工具。SDO 是一种 无毗连的体系机构,因为 SDO 客户 机与 DMS 和数据源没有毗连,所以 SDO 客户机看到的只有数据图。另外,数据 图可以包括暗示差异数据源中数据的工具。数据图包括一个根数据工具、与根关 联的所有数据工具和改观摘要(change summary,拜见本文后头的论述)。当在 应用措施组件(好比处事挪用期间的 Web 处事请求者和提供者)之间举办传输 、组件到 DMS 的传输(可能生存到磁盘)的时候,数据图被序列化为 XML。SDO 类型提供了序列化的 XML Schema。图 1 显示了一个 SDO 数据图。

图 1. SDO 数据图

办事数据东西简介

改观摘要

#p#分页标题#e#

改观摘要包括在数据图中,暗示对 DMS 返回的数据图的修改。改观摘要最初 是空的(数据图刚返回客户机的时候),跟着数据图的变革逐渐填充。在靠山更 新时,DMS 利用改观摘要将修改应用于数据源。改观摘要提供了数据图中被修改 的属性(包罗本来的值)、新增和删除的数据工具的列表,从而使 DMS 以递增 方法高效地更新数据源。只有当改观摘要日志成果被激活时,才会将信息添加到 数据图的改观摘要中。改观摘要提供了让 DMS 打开和封锁日志成果的要领,后 面的例子中还将具体对其举办先容。

属性、范例和序列

数据工具用一系列属性生存其内容。每个属性都有一个范例,该范例既可以 是根基范例(如 int )这样的属性范例,也可以是通用数据范例(如 Date ) ,假如引用的话,还可以是其他数据工具范例。每个数据工具都为属性提供了访 问和配置要领(getter 和 setter)。这些会见器要领有差异的重载版本,可以 通过通报属性名( String )、编号( int )可能属性元工具自己来会见属性 。String 会见器还答允利用类 XPath 的语法会见属性。好比,可以对公司数据 工具挪用 get("department[number=123]") 来会见编号为 123的第一个部分。 序列越发高级,可以保持差异种类的属性-值对列表的顺序。

#p#副标题#e#

SDO 和示例安装

我们已经讲了许多的观念和理论,此刻要举办一些实际操纵了。好动静是您 顿时就能利用 SDO,并且是免费的。这一节将先容一个 SDO 示例应用措施,它 将在 SDO 的 IBM 参考实现上运行,这个参考实现是 Eclipse Modeling Framework (EMF) 的一部门。我们首先将说明如何安装 EMF 2.0.1(包罗 SDO) ,然后将先容如何配置本文提供的示例应用措施。

安装 EMF 2.0.1

假如已经安装了 EMF 2.0.1,可能知道怎么安装,那么请跳过这一节,直接 阅读下一节。

IBM SDO 1.0 实现和 EMF 2.0.1 一起打包。要利用 SDO,则需要安装 EMF 2.0.1 *。您可以凭据 EMF 站点上的说明利用 Eclpise 更新打点器,也可以按 照下面的步调操纵。

*EMF 2.0.0 中也包括 SDO 1.0 的实现。

在 EMF 主页中的“快速导航”部门可以找到下载链接页面,选择下载 “v2.x: EMF 和 SDO”。安装 EMF 之前必然要阅读安装要求。安装 EMF 2.0.1 之前至少要安装了 Eclipse 3.0.1 和 Java Development Kit (JDK) 1.4。必然 要选择 EMF 2.0.1 刊行版本。打包范例发起选择“All”:emf-sdo-xsd-SDK- 2.0.1.zip,这样,就可以在一个文件中找到源代码、运行文件和文档。假如愿 意,还可以下载 SDO 的最小安装包“EMF & SDO RT”:emf-sdo-runtime- 2.0.1.zip。

在解压 Eclipse 的目次中解压 zip 文件(压缩包中的文件组织布局为 eclipse/plugins/…)。启动 Eclipse,然后选择 Help>About the Eclipse Platform,查抄 EMF 是否安装乐成。单击 Plug-in Details按钮,确 保 org.eclipse.emf.* 插件在 2.0.1 条理上。有 6 个与 SDO 有关的插件:

org.eclipse.emf.commonj.sdo

org.eclipse.emf.ecore.sdo

org.eclipse.emf.ecore.sdo.doc

org.eclipse.emf.ecore.sdo.edit

org.eclipse.emf.ecore.sdo.editor

org.eclipse.emf.ecore.sdo.source

运行时只需要两个插件: org.eclipse.emf.commonj.sdo 和 org.eclipse.emf.ecore.sdo ,假如选择仅安装运行时插件,那么您只能看到这 两个插件。这样就完成了 EMF 的安装。

安装示例 SDO 应用措施

下一步是在事情区中添加本文所用的 SDO 示例应用措施,步调如下:

启动 Eclipse 并建设一个新的 Plug-In Project。

将项目定名为 SDOSample,选择源文件夹 src和输出文件夹 bin,成立 Java 源代码。

单击 Next。

打消选择“Generate the Java class that controls the plug-in’s life cycle(生成节制插件生命期的 Java 类)”选项并单击 Finish。

然后,单击本文顶端或底端的 Code图标(可能参阅 下载部门)下载 j- sdoSample.zip,并将其解压缩到 SDOSample 目次中(在 Eclipse 窗口中选择 Import… >Zip file)。必然要保存文件夹布局并包围本来的文件,这样, 就可以用 j-sdoSample.zip 中的文件取代 SDOSample 项目。

留意:SDOSample 是作为 Eclipse 插件项目打包的,因此不需要本身配置库 依赖干系。可是,在本例中,只包括 Java 代码,假如在 CLASSPATH 中包括 EMF 和 SDO 库(JAR 文件),也可将 SDOSample 作为独立的应用措施运行。

情况配置应该与下面截屏图中的雷同。

图 2. Eclipse 情况

办事数据东西简介

此刻开始利用这个示例 SDO 应用措施。

#p#副标题#e#

一个简朴的 SDO 应用措施

本文后头将利用的示例应用措施从成果上说很有限,但它可以辅佐您更好地 领略 SDO。该应用措施包罗两部门,别离放在两个包中:dms 和 client。

SDO 1.0 没有划定尺度 DMS API。因此我们为这个例子设计了本身的 DMS 接 口,它包括两个要领,如清单 1 所示。

清单 1. DMS 接口

#p#分页标题#e#

/**
* A simple Data Mediator Service (DMS) that builds
* SDO Data Graphs of Employees and updates
* a backend data source according to a Data Graph.
*/
public interface EmployeeDMS
{
  /**
  * @param employeeName the name of the employee.
  * @return an SDO Data Graph with Data Objects for
  * that employee's manager, that employee,
  * and that employee's "employees".
  */
  DataGraph get(String employeeName);
  /**
  * updates backend data source according to dataGraph.
  * @param dataGraph Data Graph used to update data source.
  */
  void update(DataGraph dataGraph);
}

客户机将实例化 DMS,并挪用 get() 要了解见特定的雇员:Big Boss、 Wayne Blanchard 和 Terence Shorter。它以用户友好的方法在节制台中打印这 些雇员的信息,然后更新 Terence Shorter 及其雇员的部分信息。最后挪用 DMS 的 update() 要领,通报更新的 Terence Shorter 数据图。

留意,为了便于示范,我们没有实现数据源组件,但在 DMS 中,有一些如何 按照查询构建数据图的“硬编码”常识。图 3 显示了 DMS 正在利用的雇员条理 布局。

图 3. Big Boss 公司的雇员

办事数据东西简介

图中可以看出,DMS 背后的虚拟公司有 4 个雇员,条理布局如下:

Big Boss 没有上司,Terence Shorter 是其部属。

Terence Shorter 以 Big Boss 作为本身的上司,John Datrane 和 Miles Colvis 是其部属。

John Datrane 的上司是 Terence Shorter,没有部属。

Miles Colvis 的上司是 Terence Shorter,没有部属。

运行示例应用措施

右击 SDOClient.java,然后选择 Run>Java application运行上述示例应 用措施,功效如下:

清单 2. 应用措施的节制台输出

********* EMPLOYEE INFORMATION *********
Name: John Datrane
Number: 4
Title: Mr.
Department: Procurement
Is manager?: no
DIRECT MANAGER:
Name: Terence Shorter
Number: 2
Title: Mr.
Department: Financing
Is manager?: yes
****************************************
NO INFORMATION AVAILABLE ON EMPLOYEE Wayne Blanchard
********* EMPLOYEE INFORMATION *********
Name: Terence Shorter
Number: 2
Title: Mr.
Department: Financing
Is manager?: yes
DIRECT MANAGER:
Name: The Big Boss
Number: 1
Title: Mr.
Department: Board
Is manager?: yes
DIRECT EMPLOYEES:
Name: Miles Colvis
Number: 3
Title: Mr.
Department: Accounting
Is manager?: no
Name: John Datrane
Number: 4
Title: Mr.
Department: Procurement
Is manager?: no
[Total: 2]
****************************************
DMS updating Terence Shorter
(changed department from "Financing" to "The new department")
DMS updating Miles Colvis
(changed department from "Accounting" to "The new department")
DMS updating John Datrane
(changed department from "Procurement" to "The new department")

此刻我们来阐明应用措施的各个构成部门是如何事情的。

#p#副标题#e#

客户机

SDO 客户机例示了 DMS,并从中得到差异雇员的数据图。获得数据图后,通 过根工具(利用 SDO 动态 API)遍历和会见数据工具,如下所示:

// Get the SDO DataGraph from the DMS.
DataGraph employeeGraph = mediator.get(employeeName);
...
// Get the root object
DataObject root = employeeGraph.getRootObject();
...
// get the employee under the manager
employee = theManager.getDataObject("employees.0");

客户机挪用动态 SDO 会见器 API,从数据工具中得到信息,并将其显示到节制台上:

System.out.println("Name: " + employee.getString ("name"));
System.out.println ("Number: " + employee.getInt("number"));
...
System.out.println ("Is manager?: " +
  (employee.getBoolean("manager") ? "yes" : "no") + "\n");

我们已经看到客户机是如何获取信息(读)的,可是如何写入信息呢?更准 确地说,客户机如何修改工具?SDO 客户机一般利用 DataObject 写会见器要领 更新数据工具。好比,下面的代码修改从雇员 Terence Shorter 得到的数据图 :

employee.setString("department", newDepartmentName);

留意,客户机没有挪用日志要领。DMS 认真对数据图的改观摘要挪用 beginLogging() 和 endLogging() 记录日志。

数据图

#p#分页标题#e#

可以将数据图的数据名目(模子)看作 DMS 与客户机之间的抽象。客户机期 望从 DMS 获得数据图,DMS 也知道如何建设数据读(包罗从后端数据源中读取 和更新数据)。假如熟悉 XML 可能 Web 处事,那么可以将数据图模子看作界说 数据工具 XML Schema(XSD)。数据图自己就雷同 XML 实例文档。事实上,XML Schema 也是界说 SDO 模子的一种要领。

留意,数据图及其模子老是可以或许序列化为 XML。在 SDOClient.java 中将 debug 变量设为 true ,就可以看到运行时在节制台中显示的数据图的序列化版 本,与清单 3 雷同。

清单 3. 数据图的序列化版本

<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
  xmlns:company="http://com.example.company.ecore"
  xmlns:sdo="commonj.sdo"
  xmlns:sdo_1="http://www.eclipse.org/emf/2003/SDO">
  <changeSummary>
   <objectChanges key="#//@eRootObject">
    <value xsi:type="sdo_1:EChangeSummarySetting"
     featureName="department" dataValue="Board"/>
   </objectChanges>
  </changeSummary>
  <company:Employee name="The Big Boss"
   number="1" department="The new department" title="Mr."
   manager="true">
   <employees name="Terence Shorter" number="2"
    department="The new department" title="Mr." manager="true">
    <employees name="Miles Colvis" number="3"
     department="The new department" title="Mr."/>
    <employees name="John Datrane" number="4"
     department="The new department" title="Mr."/>
   </employees>
  </company:Employee>
</sdo:datagraph>

在本例中,数据图由 Employee 数据工具(以及改观摘要)构成。Employee 包括姓名、编号、部分、职务、上司(打点该雇员的另一位雇员)和部属(该雇 员打点的其他雇员)等属性。该例中,雇员已经位于硬编码的数据源中时,DMS 返回的数据图的名目老是雇员的上司(假如有的话)、雇员及其直接部属(假如 有的话)。

#p#副标题#e#

DMS 构建数据图

SDO 1.0 没有划定 DMS API,API 应该包括数据图模子自己的设计和建设。 因为成立对数据源的会见要思量许多种环境,设计数据图自己可以作为另一篇文 章的主题。

对这个例子,我们将回收 DMS 通过动态 EMF API 界说的雇员模子。示例数 据图没有 XSD 这样的模子文档。实际上,因为工具是动态生成的,所以这意味 着没有生成 Employee Java 类。假如利用静态要领,就会生成这样的类。

DMS 利用差异的数据会见 API(JDBC、SQL 等)从差异数据源获取的信息。 可是,一旦从后端(该例中是硬编码的常识)检索到信息,DMS 就转而利用 EMF API(eSet、eGet)而非 SDO API 来建设数据工具的数据图。这种要领能获得较 好的机能,但缺点是不能跨 SDO 实现移植。

对付主要存眷机能,同样的 DMS 设计也可利用 SDO API 实现。在这种环境 下,DMS 类( employeeClass 、 employeeNameFeature 等)中缓冲的元工具, 将取代 EMF 范例 EClass 、 EAttribute 和 EReference 等),成为 commonj.sdo.Type 和 commonj.sdo.Property 的范例。另外,假如机能不重要 ,那么可以利便地利用基于 String 的 SDO API(如 setBoolean(String path, boolean value) ),因此不需要缓冲元工具。不幸的是,这种办理方案固然更 利便,但运行起来也更慢。

下面的代码片断说明白 SimpleEmployeeDataMediatorImpl.java 中 Employee 模子的界说。但这些代码并没有构建 SDO 工具,构建的仅仅是 SDO 工具的模子:

protected EClass employeeClass;
protected EAttribute employeeNameFeature;
protected EReference employeeEmployeesFeature;
...
employeeClass = ecoreFactory.createEClass();
employeeClass.setName("Employee");
EAttribute employeeNameFeature = ecoreFactory.createEAttribute();
...
  
// employees (that the employee manages)
employeeEmployeesFeature = ecoreFactory.createEReference();
employeeEmployeesFeature.setContainment(true);
...
EPackage employeePackage = ecoreFactory.createEPackage();
employeePackage.getEClassifiers().add(employeeClass);
...

#p#分页标题#e#

留意,我们利用值 true 对 employees EReference 挪用 setContainment ,因此每个雇员都“包括”他或她的部属。不然,嵌套的雇员就不会(即被包括 )在数据图中,改观摘要也只能包括根工具的修改,而不能包括其他雇员的修改 。

建模 SDO

您大概想“很有趣,可是这样只能获得 EMF 工具而不是 SDO 工具,尚有什 么窍门吗?”虽然有,并且很简朴。Employee EClass 属于 employeePackage EPackage ,而且包括下面的挪用:

// Have the factory for this package build SDO Objects
employeePackage.setEFactoryInstance(
  new DynamicEDataObjectImpl.FactoryImpl());

运行时,这个工场将建设 DynamicEDataObjectImpl 范例的工具,该工具实 现了 DataObject 接口(即它是一个 SDO 数据工具),而不是默认的 DynamicEObjectImpl 接口,而且可以智能地建设普通的 EMF 工具。SDO 和 EMF 工具之间的干系就很清楚了:SDO 工具就是同时实现了 SDO DataObject 接口的 EMF 工具。事实上,这些附加要领的实现是委派给焦点 EMF 要领实现的。

建设 SDO 实例

此刻,已经拥有了我们的数据工具,就可以成立 Employee 的实例并配置不 同的属性了。如前所述,我们将利用 EMF API 来最洪流平地提高机能。

EObject eObject = EcoreUtil.create(employeeClass);
// Note: we could cast the object to DataObject,
// but chose to use EObject APIs instead.
eObject.eSet(employeeNameFeature, name);
eObject.eSet(employeeNumberFeature, new Integer(number));
... ...

可以利用“employees”引用把雇员“链接”在一起,好比:

((List)bigBoss.eGet(employeeEmployeesFeature)).add (terence);

一旦建设了数据工具,还需要将其毗连到数据图中。我们首先要挪用数据图 的 setRootObject() 要领,通报但愿用作根的数据工具,这里利用 Employee The Boss 。

EDataGraph employeeGraph = SDOFactory.eINSTANCE.createEDataGraph();
... ...
employeeGraph.setERootObject(rootObject);

继承接头数据图之前,要先开始记录日志。假如但愿利用 SDO,那么在窜改 数据图之前,要先挪用其改观摘要的 beginLogging() 要领。根基的道理就是清 除以前的变革,开始监听新的修改。

// Call beginLogging() so that the Change Summary is
// populated when changes are applied to the Data Graph.
// The DMS should call beginLogging() and endLogging(),
// not the client.
employeeGraph.getChangeSummary().beginLogging();

DMS 的另一项任务(凭据 EmployeeDataMediator 接口的界说)是按照 SDO 客户机提供的数据图更新后端数据源。

#p#副标题#e#

DMS:更新数据源

DMS 应该利用 SDO 的强大特性更新后端数据源,详细地说,就是要利用其变 更摘要。利用数据图的改观摘要有很多差异的要领。该例中,我们将考查改观摘 要树中引用的所有数据工具,并从中得到新的数据工具。

清单 4. DMS 按照数据图更新后端数据源

/**
 * Update the DMS's backend data to reflect changes
 * in the data graph.
 * Since this DMS has no actual backend data and therefore
 * has nothing to update, we will just navigate
 * the change summary and report (print) what's changed.
 */
public void update(DataGraph dataGraph)
{
  ChangeSummary changeSummary = dataGraph.getChangeSummary();
 
  // Call endLogging to summarize changes.
  // The DMS should call beginLogging() and endLogging(),
  // not the client.
  changeSummary.endLogging();
  // Use SDO ChangeSummary's getChangedDataObjects() method.
  List changes = changeSummary.getChangedDataObjects();
  for (Iterator iter = changes.iterator(); iter.hasNext();)
  {
    DataObject changedObject = (DataObject)iter.next();
    System.out.print("DMS updating " +
      changedObject.getString("name"));
    for (Iterator settingIter = changeSummary.getOldValues(
      changedObject).iterator(); settingIter.hasNext();)
    {
      ChangeSummary.Setting changeSetting =
        (ChangeSummary.Setting)settingIter.next();
      Property changedProperty = changeSetting.getProperty();
      Object oldValue = changeSetting.getValue();
      Object newValue = changedObject.get(changedProperty);
      System.out.print(" (changed: " + changedProperty.getName() +
        " from \"" + oldValue + "\" to \"" + newValue + "\")");
      // If not a simple example, we could update the backend here.
    }
    System.out.println();
  }
}

该例中基础没有后端更新。但在实际应用时,后端更新应该在这个要领中完 成。

#p#分页标题#e#

DMS 首先要对数据图的更新摘要挪用 endLogging() ,从客户机取回数据图 ,以便举办后端更新。这样将封锁改观记录,从而提供自 beginLogging() 挪用 以来(凡是在建设之后挪用)对数据图所做修改的摘要。这种名目支持 DMS 高 效、递增地更新后端数据源。改观摘要中的修改分为三种范例:

工具改观包括数据图中属性已经被修改的那些数据工具的引用、被修改的属 性和修改之前的属性值。DMS 可以利用本来的属性值确保后端数据在此期间没有 被此外人修改。

工具建设包括添加到数据图中的数据工具。将这些工具暗示了需要添加到后 端数据布局中的新数据。

工具删除包括从数据图中删除的数据工具。这些工具暗示了需要从后端数据 布局中删除的数据。

留意,我们利用尺度的 SDO API 查抄数据图的变革,固然也可以利用 EMF ChangeDescription API(而不是 SDO 的 ChangeSummary)。该例中仅仅更新简 单的属性值,对机能的影响不是很明明。但在其他环境下,例如说要更新大量的 属性,利用 EMF API 可以显著地提高机能。好比,假设要从数百个雇员的列表 中删除一个雇员。在这种环境下,ChangeSummary 只能提供对原有数百个雇员列 表中的原有值的会见。而 EMF 的 ChangeDescription 接口还可以提供更详细的 信息,如“删除某个索引位置的雇员”,这就有用得多。

还要留意的是,该改观摘要中只修改了一个工具,没有删除可能添加工具。 假如利用 SDO 实现从数据图中删除工具,还要留意范例为 objectsToAttach 的 元素。该名称实际上是工具删除的 EMF ChangeDescription 名。这些元素是那 些已经删除可是在回滚时需要放回图中的数据工具,这就是改观的 EMF 视图。 总而言之, objectsToAttach == deleted objects(删除的工具) 。

调试应用措施

假如在示例应用措施中将 debug 变量设为 true ,那么就可以执行以下挪用 ,查察数据图的序列化版本。

((EDataGraph) dataGraph).getDataGraphResource().save (System.out, null);

还可以利用 Eclipse 调试情况。好比,我们发起在 SDOClient.java 第 100 行配置一个断点,并调试 SDOClient (像在 Java 应用措施中那样)。然后, 在调试窗口中就可以看到内存中的数据图(在 Variables 下)和它的数据工具 (Boss、Terrence Shorter 等),如图 4 所示。

图 4. 在调试模式下调查数据工具

办事数据东西简介

还可以用这种要领查察改观摘要,如图 5 所示。

图 5. 在调试模式下调查改观摘要

办事数据东西简介

上面的截屏图看起来很巨大,此刻看来用处也不大,可是当您调试本身的 SDO 应用措施并查察数据工具和改观摘要的内容时,就会用到它。

竣事语

本文扼要描写了 SDO 及其成果。我们通过一个示例应用措施说明白 SDO 的 一些成果。更多参考信息,请参阅 Eclipse 辅佐系统下的 SDO API 文档。该规 范仍在成长和改造之中。好比,SDO 1.0 强调了 SDO 的客户机方面,而没有指 定一个 DMS API。SDO 今朝正通过 JCP 实现尺度化,请存眷有关的希望环境。 因为 SDO 很是机动,设计 SDO 应用措施时需要做许多决定。这些决定将影响程 序的重用性和机能。因此,在编码之前,应应当真思量应用模式和应用措施数据 的特征。

本文配套源码

    关键字:

在线提交作业