O/RM技术可以简化数据访问,但也需要注意到引入这个新的抽象层来的挑战。
关键字:对象-关系映射
现代的应用程序常常是使用两种截然不同的技术构建而成:业务逻辑部分使用面向对象编程,数据存储使用关系型数据库。面向对象编程是实现复杂的系统的一个关键技术,它提供的好处包括可重用性、健壮性和可维护性。关系型数据库是保存数据的仓库。O/RM(对象关系映射)则是两者之间的桥梁,它允许应用程序以面向对象的方式访问关系数据。
O/RM是对象持久化的一个专业化的一般概念。IBM研究员格雷迪·布赫在他的书《面向对象的分析与应用设计》中,将“持久性”定义为“在程序生命周期之外的数据”,是对象模型1中的次要元素。然而,在现代应用程序中,贡献在持久化上的工作量,有时可以主宰一个项目的成本,而使用O/RM工具,可以显着降低成本。
有一些其他技术可以用于从面向对象的程序访问关系型数据,但这些技术一般不利用编程语言的对象模型特性。要充分利用对象模型的特性,数据库访问技术需要支持信息隐藏、关注点分离、继承、变化检测、唯一性保持和数据库独立性。
关注点分离是将一个程序分为一些逻辑部分的过程,这些部分有很少或根本没有重叠。在数据库编程中有几部分应分开:1)业务方法中查找和操作领域对象的方法;2)领域对象中可能会导致内部状态的变化的方法和可能会调用相关联的对象方法的方法;3)生成的数据库命令中对行和列执行插入,查询,更新,和删除的;4)以及用于数据库事务划分的方法。
信息隐藏是关注点分离的一个实现策略,此策略根据接口定义的行为实现特定的类,以降低复杂性和成本。类实现的行为要和调用者的行为分开。改变一方的行为并不一定需要也改变另一方。
继承允许代码的重用,一些相关联的类中共同的行为只被定义一次,具有唯一性的行为只在类之间的行为不同的地方实现。如此,一个类的行为和子类或父类(超类)的行为相较,可能是相同或不同的,并且此行为独立于调用者的行为。
变化检测在一个数据库事务中一直跟踪领域对象的变化,所以在事务结束时,更改将应用到数据库。
唯一性保持是数据库交互中的一个属性,在交互中一个独立领域实例对应一个数据库行,而不管用户是如何获得对象的:通过查询数据库,从一个实例的引用导航到另一个,或通过提供其首要识别符找到一个确定的领域实例。假若没有唯一性保持,对一个领域实例进行的更改将不会被其他代表同一数据库行的领域实例看到,这可能会导致数据库损坏。
数据库独立性,允许使用一个共同的API和领域模型操作各种数据库而不改变数据库的应用程序视图。
最早用于访问关系数据库的技术(现在仍然非常流行),使用许多API传输SQL语句到服务器,并把执行语句的结果返回给应用程序。这会留给应用程序来决定,是直接使用结果还是创建数据结构来表示查询的结果,并复制查询结果给这些数据结构。
直接模式化的查询结果所用的的数据结构,无法模型化数据库中存在的关系;因此,实例之间的关联没有被数据结构充分描述。使用这种类型访问的例子包括ODBC(开放数据库连接)接口和JDBC(Java数据库连接)接口。这些接口允许有限的关注分离,但更多情况下是业务逻辑与数据库编程混合在一起。他们不支持信息隐藏,继承,变化检测,唯一性保持或数据库独立性。
更强大的技术是在其接口中提供一些方法将查询结果复制到用户指定的数据结构。用户提供所有注释过的SQL语句,使它们可以对应数据结构。用户创建的SQL语句包括所有的查询,加上插入,更新和删除。这些技术处理很多容易出错和耗费时间的工作以分析查询结果,但仍然给用户留下许多艰巨的任务。以这种风格访问的一个例子是iBATIS,它支持信息隐藏和有限的关注分离,但不支持继承,变化检测,唯一性保持或数据库独立性。
使用O/RM,存储在关系数据库中的数据将作为本地对象编程语言中的对象表示给应用程序。程序员映射领域对象模型类到关系表,并使用一个由持久性提供程序实现了的API来访问数据库。对数据库的查询表达为领域对象模型的方式。提供程序直接从领域模型生成SQL语句。马丁·福勒称这种方法DataMapper.2
O/RM技术和产品在许多面向对象的语言中可用,包括Java,C++,C#,Python,Smalltalk,Ruby和Groovy。O/RM所用的技术和编程范式适用于许多支持这些语言的产品。(在这篇文章中,例子使用Java)