收获丰富的两个星期和ECO OR Mapping
这段时间我没有写Blog,主要的原因是除了忙于即将到来的技术研讨会之外,另外就是最近在阅读《长尾理论》、《历史家》、《吴清源传》和《林海峰传》四本书。这四本书都非常精彩,让我无法不一次读完它们,因此过去的两个星期都是在阅读和思考中度过的。《长尾理论》和《历史家》这两本书不但让我享受阅读的乐趣,也让我的脑子在阅读时不停地思考。例如阅读《长尾理论》时我不停地思考书中的内容是如何对映到IT界的,《长尾理论》又是如何解释Borland/DevCo最近的状况和演变的,《长尾理论》又是如何可以对映到我的学习之路和未来的发展的。而在阅读《历史家》时除了享受故事内容的同时,我也从IT人的思考角度找到了书籍内容中数个不合理的臭虫,而这一点我太太则是嘲笑我的职业病已经快到了无可救药的地步,不过《历史家》最后的结局却让我思考为什么卓九勒只是“历史家”而不是“程序员”,因为卓九勒发展出来的搜寻技术早己远远超过Google,如果卓九勒把它发展成“吸血鬼搜寻引擎技术”的话,那么不但可以发大财,而且几乎可以掌控世界,呵呵。
关于《长尾理论》的想法等我有时间了再详细介绍给大家,这次先让我谈谈有关OR Mapping的问题吧。
由于最近我在收尾ECO程序设计一书,正好写到有关ECO OR Mapping的内容,为了补充我个人在这方面的知识,因此我在Google上搜寻有关ECO OR Mapping相关的内容,有趣的是我看到了许多有关的讨论。许多人都关心ECO的OR Mapping技术,也非常有兴趣,有人甚至询问ECO的OR Mapping和Hibernate/NHibernate的比较,也有许多人担心ECO OR Mapping的透明性,以及如何在已有/旧的数据库模式和数据库数据上使用逆向工程产生封装类,但是又想在不改变已有/旧的数据库模式的状态下能够加上新的数据库数据表和封装类?
当然,对于这些问题也有许多人回答,提供了各种不同的答案。例如下面的一段话是我在某个有关OR Mapping的Blog中看到的:
我没有研究过NHibernate,不过我深入研究过ECO/ECOII,当然现在是ECOIII了。从设计目标上讲,ECO是非常优秀的,模型来自于UML,透明度极高,但是对数据库的控制度很低,这一点我不太能接受,因为完全照UML来设计数据库稍稍控制不好会导致一些严重的性能问题(我亲自经历过的案例)。我的目标仅仅是来自ER模型,设计时的透明度会有所降低,但对数据库的控制度比较高,并且既适宜新构建的系统又适宜已有数据库的系统甚至是异构的数据库系统。
我看了这段话之后我不太能理解作者说的ECO对于“数据库的控制度很低”是什么意思? 另外这段话又说“适宜已有数据库的系统甚至是异构的数据库系统”,我在想ECO也提供了这些功能啊。
另外我又常常看到下面的问题:
我知道直接从ECO model产生的table会有ECO_ID和ECO_TYPE等字段,请问要如何做才能享受用model修改的方便但又不变动原有数据库(可加新table)?
这个问题和第一位作者说的“适宜已有数据库的系统甚至是异构的数据库系统”有关,简单地说,是许多人在问ECO如何能够和现有存在的系统共存? 让开发人员能够在不影响旧有系统的数据情形下能够使用ECO技术开发后续的系统?
如果让我整理一下上面的问题,其实都是和ECO的OR Mapping有关,ECO不管是使用正向工程从业务逻辑模型自动产生数据库模式,或是从现有的数据库模式中以逆向工程产生封装类,开发人员都可以控制ECO的OR Mapping运作机制,其中的关键点就是ECO是一个RAD MDA工具,为了让开发人员快速使用MDA/DDA开发应用系统,因此,把OR Mapping做得非常自动化,让许多人误以为ECO的OR Mapping对于“数据库的控制度很低”,或是无法在现有的系统中结合ECO,因为ECO的OR Mapping会自己产生相关的数据库模式来运作。
其实ECO的OR Mapping可以像Hibernate/NHibernate使用XML来定义OR Mapping的规则,在ECO中这称为自定义 OR Mapping功能。开发人员可以在正向工程产生了数据库模式之后,结合FileMapperProvider和自定义 OR Mapping功能进行数据库的控制工作,而且开发人员在了解了ECO业务逻辑模型后,ECO内置上的OR Mapping机制,OCL转换SQL原理之后,甚至可以使用SQL来处理数据。
同样,在逆向工程方面也是如此,ECO的OR Mapping除了可以根据现有的数据库模式产生封装类之外,也允许开发人员自己在数据库中建立新的数据表,再借助ECO的设计器自动产生封装类,最后借助自定义 OR Mapping来定义新的数据表和新的封装类之间对映的关联,就像Hibernate/NHibernate一样。
为了让各位对于自定义 OR Mapping有概念,让我使用一个许多人都熟悉的范例,就是使用ECO的逆向工程从数据库产生封装类,接着再使用自定义 OR Mapping来增加新的数据表和新的封装类而不破坏已有的数据表和数据。这个范例使用InterBase的范例数据库employee.gdb来说明。
首先建立一个ECO ASP.NET项目,在FileMapperProvder中放入PersistentMapperBdp和连接到employee.gdb的BDP连接,接着在FileMapperProvder设计器中启动Wrap existing Database with Eco菜单以进行逆向工程,之后就会产生waORMappingDemoOrMapping.xml这个对映文件和如下的类架构:
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 301.5pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image001.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOZN-_Ck6BY3qTgafFxhZBh57-iYr6UosjAYSm32rR50iNR1IoBchvEjrmvi9CaC1nL-JgVQ-1su0lkio8LIjBzCXQ1iJUd-0St-loQe4KKCt3mql3PkXTCQ"></imagedata></shape>
例如现在我们就可以执行这个ECO ASP.NET应用程序,从下图中就可以看到ECO ASP.NET应用程序可以正确地使用面向对象的对象处理存在于employee.gdb之中的关联式数据了:
<shape id="_x0000_i1026" style="WIDTH: 398.25pt; HEIGHT: 4in" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image003.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOX47gciJuz_wcYkU0G-B4XDu-DjWde0XreKGKo_0QH6pyAv8GebYeUhySTUosRdMDS-3TTvGhYsVSaKnbpCkFLBGanE4J3WRdcKycBp-FuXTvOUk2g5kh80"></imagedata></shape>
接着让我们关闭项目,然后自行在employee.gdb中建立一个新的数据表TestTable,如下:
<shape id="_x0000_i1027" style="WIDTH: 273.75pt; HEIGHT: 152.25pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image005.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOSC7hCjvzxe79AIF3G_cqUEfnxjLdLeGMYMdJyOmuMQAUKW2wt0zC0dFVb52-N-WCKFxADnpnN3PEQesQmQVsJYBcz76XDH7V0HObAK-hoyyxZzYZiv1ZzE"></imagedata></shape>
由于在前面我们已经使用逆向工程建立了封装employee.gdb的类,而现在在employee.gdb中又新增了一个TestTable数据表,那么我们如何在不影响原来的数据情形下加入TestTable数据表到ECO的项目中?
这其实很简单,关键点是两个文件的内容,它们是定义封装类和数据库模式之间对映的规则的文件:waORMappingDemoOrMapping.xml。以及叙述逆向工程的整个模型:EmployeePackage.ecopkg。只要开发人员适当地处理这两个文件的内容就能够完成这项工作。
首先让我们处理对映的规则的文件:waORMappingDemoOrMapping.xml。这个文件就像Hibernate/NHibernate使用的对映配置XML文件一样,开发人员可以借助修改其中的内容来自定义ECO是如何对映封装类和数据表的。现在我们需要在waORMappingDemoOrMapping.xml中加入一个新的类,定义如下:
<ClassDef Name="TestTable">
<AliasDef Name="TestTable_1" Database="employee" Table="TESTTABLE" ExtentRequiresDiscriminator="False" IsMainAlias="True">
<KeyImpl Name="EcoKey">
<KeyColumn Name="TID" />
</KeyImpl>
</AliasDef>
<KeyDef Name="EcoKey" Signature="System.Int32" IsId="True" KeyMapper="Attribute"/>
<AttributeDef Name="ID" Alias="TestTable_1" Columns="TID" />
<AttributeDef Name="FName" Alias="TestTable_1" Columns="FNAME" />
</ClassDef>
一旦加入了这个类定义,ECO的OR Mapping就知道业务逻辑模型中存在了TestTable。
接着再于waORMappingDemoOrMapping.xml中加入下面叙述TestTable数据表模式的信息:
<Table Name="TESTTABLE">
<Column Name="TID" AllowNULL="False" Type="" Length="4" DefaultValue="" />
<Column Name="FNAME" AllowNULL="False" Type="" Length="50" DefaultValue="" />
</Table>
一旦拥有了这两个定义,ECO就知道TestTable类是对映到TESTTABLE数据表。
现在我们需要让ECO的业务逻辑模型知道有了新的TestTable类的存在,所以我们可以在ECO类设计器中加入TestTable类,如下:
<shape id="_x0000_i1028" style="WIDTH: 285pt; HEIGHT: 209.25pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image007.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOck4T3VSkENP3BspKXlaGFwxMpy4eOkqOBuunvA8Do6Qhdn4VwI05ZpZhnBeA7GPmiGFmMYx-Ml6Ebe0j4AK3--bZZyupo3ep2FX5kxDrukPJc2bo0QUrMI"></imagedata></shape>
这个目的是让TestTable类能够正确地叙述在整个业务逻辑模型的文件EmployeePackage.ecopkg之中。
完成了这些操作之后,再次执行范例应用程序,我们就可以看到如下图所示的画面:
<shape id="_x0000_i1029" style="WIDTH: 133.5pt; HEIGHT: 159pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image009.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOa2reX5WQSh6twwSoKv03Y-xyKzkO-3BQ_yvJ0DPDQwvpQNLAhI-zZ9P76FM1B5my19BHtc9LIcDwvSnbVe3ToMw9d_vkmLC8Bu0aT8cubLyehzuuZkrgyw"></imagedata></shape>
TestTable果然正式加入了我们的业务逻辑模型,而且我们的确可以在ECO ASP.NET应用程序中处理这个数据表的数据:
<shape id="_x0000_i1030" style="WIDTH: 149.25pt; HEIGHT: 126pt" alt="" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1.1F0%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image011.jpg" o:href="http://tkfiles.storage.msn.com/x1phiCZJPhsUYg-Rf0H_plhOb-Ot9_2yKRJXP7flVMAhpy9TCRUK8xAdzikc22Qi7nlSqJkirfHJQ32MVxyRndW98lkfRhwGQCxGbpqvrCcA1HpNsrb5uQqiwqcboJd37jpXIwTIx3BLVk"></imagedata></shape>
当然,开发人员也可以在这个借助逆向工程产生的ECO ASP.NET应用程序中使用SQL来处理原有的数据,它的透明度和任何传统的数据库应用程序是一样的。
在Delphi 2006的手册中有更多关于自定义的ECO OR Mapping的数据,借助这些自定义的功能,开发人员可以定义任何复杂的自定义OR Mapping的工作,Have Fun!
李维先生简体版博客由博文视点陈元玉编辑负责繁转简以及版式设计,如有疑问敬请您与编辑联系,联系方式:chenyy@broadview.com.cn
分享到:
相关推荐
**标题:“OR_Mapping_Simulation”** 在Java世界中,对象关系映射(ORM)是一种技术,它允许程序员使用面向对象的方式操作数据库,而无需直接编写SQL语句。"OR_Mapping_Simulation"指的是对这种映射过程的一种模拟...
标题中的“简单的OR-Mapping工具---不差托作者”指的是一个关于对象关系映射(Object-Relational Mapping,简称ORM)的简易工具,由作者“不差托”开发。ORM是一种编程技术,它允许程序员使用面向对象的方式操作...
### OR Mapping中对象关系映射解决方案汇总 #### 继承关系映射方案 在面向对象编程中,继承是一种常见的机制,允许子类继承父类的属性和方法。在ORM(对象关系映射)环境中,正确处理继承关系对于构建高效、灵活的...
一、solidity中,映射的关键字为mapping,首先我们先来定义两个mapping, mapping(address =>uint) idmapping和mapping(uint =>string) namemapping。idmapping用来表示地址变量和整型变量的对应关系,在注册过程中...
在开发过程中,手动编写Mapper接口和对应的XML配置文件是一项繁琐的工作,而“mybatis的Mapping接口和配置文件自动生成”工具则能有效地解决这个问题,极大地提高了开发效率。 该工具的核心功能是基于SQL Server...
综合以上信息,我们可以推测“Mapping Tools”是一个使用C#编写的,旨在提高设备接触点匹配效率和准确性的智能工具,它可能广泛应用于工业自动化、物联网、智能家居等领域。深入研究这个工具的源代码,不仅可以提升...
mapping文件约束头.xml
这个jar包包含SAP PI Java Mapping的API接口,它提供了一系列的类和接口,如`StreamHandler`,用于处理输入和输出流,以及`MappingException`用于处理异常情况。开发人员通过实现这些接口来定义数据的转换规则。 3....
MATLAB Mapping Toolbox是MATLAB软件环境中的一个重要工具箱,专为地球科学、航空航天、地理信息系统(GIS)以及导航领域的研究人员和工程师设计。它提供了丰富的函数和工具,用于处理和可视化地理空间数据,包括...
而"dot3_bump_mapping"则是一种更具体的技术,它利用了硬件加速的向量运算,特别是两个向量的点乘(dot product)操作,来计算光照与表面法线的相对角度,进而改变颜色输出,以实现更为高效的bump mapping。...
该工具箱包含了丰富的函数和应用程序,用于处理、分析和可视化地理空间数据,提供了一个强大的平台来执行地球物理、气候学、遥感和导航等领域的复杂任务。本文将深入探讨在R2019b版本下,如何安装和使用MATLAB ...
TcpMapping软件就是这样的一个端口转换工具,它可以帮助用户在局域网内设置端口映射规则,将外部网络的请求定向到内部网络的特定设备和服务。具体来说,TcpMapping可以做到以下几点: 1. **端口映射设置**:用户...
SANGFOR NGAF 6.8 DNS-Mapping 配置指导 SANGFOR NGAF 6.8 DNS-Mapping 配置指导是深信服...SANGFOR NGAF 6.8 DNS-Mapping 配置指导为用户提供了详细的配置指南和知识点,帮助用户快速掌握 DNS-Mapping 的配置和应用。
3. common:这个目录可能包含了一些通用的函数库或者头文件,这些代码可能被多个HDR或tone mapping相关程序共享,比如图像加载和保存函数、数学运算库等。 4. templates:这个目录可能包含了一些模板文件,用于创建...
这个工具箱提供了丰富的函数和应用程序,使得用户能够轻松地处理经纬度数据、创建各种类型的地图、进行坐标转换以及执行地理空间分析。 1. **地图创建与可视化** - 地图投影:Mapping Toolbox支持多种地图投影方式...
在摄影和计算机图形学中,tonemapping是对高动态范围图像进行处理的过程,通过降低整体对比度并调整不同亮度级别的强度,以便在标准显示器上呈现更加自然且细节丰富的图像。由于人眼具有宽广的动态范围,可以看到极...
在描述中提到,“内网端口映射,两个端口都可以正常使用”,这意味着该压缩包可能包含了一个能够设置和管理双向端口映射的软件。通常,这种工具允许用户指定内部网络中的一个私有端口和外部网络中一个公共端口之间的...
描述中提到的"l0,l1范数"是数学中衡量向量或矩阵稀疏性的两个重要工具。L0范数计算的是非零元素的数量,而L1范数则是所有元素绝对值之和。在图像处理中,这两种范数常用于图像去噪、特征选择和图像分解。通过对图像...
在计算机图形学领域,凹凸映射(Bump Mapping)是一种增强表面细节的技术,它可以给物体表面带来更丰富的视觉效果,使原本平坦的表面看起来有起伏和纹理。本项目是基于OpenGL实现的凹凸映射,同时包含了镜面反射功能...