快速业务通道

服务数据对象简介 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
得到较 好的性能,但缺点是不能跨 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); ...

注意,我们使用值 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() 方法。基本的原理就是清

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号