对象关系映射(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则:
简单:以最主要的形式建模数据。 传达性:数据库结构被不论什么人都能理解的语言文档化。 精确性:基于数据模型创建正确标准化了的结构。
典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须可以用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这样的联系。
对象-关系映射(Object/Relation
Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。 面向对象是从软件project基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的差别。为了解决这个不匹配的现象,对象关系映射技术应运而生。 让我们从O/R開始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。差点儿全部的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们须要把对象的信息保存在关系数据库中。 当你开发一个应用程序的时候(不使用O/R
Mapping),你可能会写不少数据訪问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了非常多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是反复的。 假设打开你近期的程序,看看DAL代码,你肯定会看到非常多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象加入SqlParameter,把全部属性和对象相应,设置SqlCommand的CommandText属性为存储过程,然后执行SqlCommand。对于每一个对象都要反复的写这些代码。 除此之外,还有更好的办法吗?有,引入一个O/R
Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R
Mapping保存,删除,读取对象,O/R
Mapping负责生成SQL,你仅仅须要关心对象就好。 对象关系映射成功运用在不同的面向对象持久层产品中,如:Torque,OJB,Hibernate,TopLink,Castor
JDO, TJDO
等。 一般的ORM包含下面四部分: 一个对持久类对象进行CRUD操作的API; 一个语言或API用来规定与类和类属性相关的查询; 一个规定mapping
metadata的工具; 一种技术能够让ORM的实现同事务对象一起进行dirty checking, lazy association
fetching以及其它的优化操作。
眼下流行的 ORM 产品
眼下众多厂商和开源社区都提供了持久层框架的实现,常见的有: Java系列: Apache
OJB () Cayenne () Jaxor () Hibernate () iBatis () jRelationalFramework
() mirage () SMYLE () TopLink () 当中 TopLink 是 Oracle 的商业产品,其它均为开源项目。 当中
Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至代替复杂而又繁琐的 EJB 模型而成为其实的 Java ORM
工业标准。并且当中的很多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0
规范的标准,这也是开源项目影响工业领域标准的有力见证。 .Net系列: EntitysCodeGenerate LINQ TO
SQL Grove Rungoo.EnterpriseORM FireCode Creator MyGeneration CodeSmith
Pro CodeAuto ... 当中: EntitysCodeGenerate
:是(VB/C#.Net实体代码生成工具)的简称,EntitysCodeGenerate(ECG)是一款专门为.Net数据库程序开发量身定做的(ORM框架)代码生成工具,所生成的程序代码基于面向对象、分层架构、ORM及反射+工厂模式等。支持.Net1.1及以上版本号,可用于Oracle、SqlServer、Sybase、DB2、MySQL、Access、SQLite、PostgreSQL、DM(达梦)、PowerDesigner文件、Informix、Firebird、MaxDB、Excel等和OleDb、ODBC连接的数据库并可自己定义,详见工具的帮助文档和演示样例。 LINQ
TO SQL :微软为SqlServer数据库提供的,是.NET Framework 3.5
版的一个组件,提供了用于将关系数据作为对象管理的执行时基础结构。 Grove:即Grove ORM Development
Toolkit。包括Grove和Toolkit两部分内容。Grove为ORM提供对象持久、关系对象查询、简单事务处理、简单异常管理等功能。 Rungoo.EnterpriseORM
:
是一个基于企业应用架构的代码生成工具,主要适用于B/S模式的应用系统开发。开发语言:C#,支持VS2003和VS2005两个版本号的开发平台,同一时候支持SQL
Server2000/2005。 风越代码生成器 [FireCode
Creator]是一款商业共享基于多种数据库的程序代码生成软件,可高速建立:加入、编辑、查看、列表、搜索功能。支持的数据库:SQL
Server、Access、Oracle、MySql、Excel、FoxPro、FoxBase、Text等数据库连接。
对象-关系映射模式
从《公共仓库元模型:开发指南》一书第8章CWM元仓库中摘录出来的内容,实现了公共仓库元模型(CWM)的UML图到Microsoft
SQL Server数据库的映射,是一种将对象层次结构映射成关系型结构的方法。个人觉得能够作为将本体(Ontology)文件存储到关系型数据库中的一种可借鉴方法。 基本情况:公共仓库元模型(CWM)是对象管理组织(OMG)的一种和数据仓库相关的元模型标准,採用UML表示的对象层次结构,在保存到数据库中时因为面向对象的数据库技术的不完好(理论研究和商业应用都不是主流),所以该书的作者倾向于使用成熟的关系型数据库来保存-这也是存储本体时所遇到的问题。 採用方法:将UML模型中的各种元素通过转换,保存为数据库模式。因为CWM是一种元模型,因此模型的实例也是一种模型,将这样的实例以数据库数据的形式保存。使用数据库中比較成熟的存储过程技术提高开发和运行效率。 1、数据类型映射模式 1.1简单数据类型模式:建立UML和关系型数据库中简单数据类型的映射表以指导映射。 1.2枚举数据类型模式:每种枚举类型相应一个表,仅仅有一个列(_EnumLiteral)表示枚举值。 1.3基于类的数据类型模式:使用外键约束,将基础列与基于类的类型实例相关联。 2、类映射模型 每一个类相应一个表。单值属性、多值属性、继承关系能够用下述方法映射,而引用属性将在关联映射模式中提到。 2.1单值属性模式:是cardinality的上界为1的属性,映射到类所相应的表的列上。若其下界也为1(必须有的属性),列属性为NOT
NULL。 2.2多值属性模式:每一个多值属性映射成一个独立的表,使用外键连接到类所相应的表上。 2.3继承模式:每增加一个类的实例时,依据其继承关系自顶向下生成每一个类的对象,这些对象具有同样的ID(根对象相应记录的主键)。删除对象实例时,自底向上删除数据。遇到从中间删的情况怎么办?多重继承怎么处理?(金龙飞) 3、关联映射模式 3.1一对一关联模式:在关联两端各加一列。 3.2一对多关联模式:和3.1一样。假设多这端是有序的,还需增加一列表示序号。 3.3多对多关联模式:将关联单独作一个表。 3.4组合关联模式:注意级联式删除。 3.5反演关联模式:关联两端指向相关的类型,和普通关联一样。 3.6成对关联模式:关联记录两个类间的关系,用交集类表示关联,表示成一个单独的表,每一个关联相应一个表,用外键表示它们间的关系。 3.7关联上的OCL须要分析成相应的存储过程代码。 3.8保证关联的cardinality也须要分析成相应的存储过程代码。 4、引用映射模式 在UML中不存在的MOF特征,指属性是声明为引用类型的实例。用存储过程实现。