为什么是对象关系映射(ORM)
当我们工作在一个面向对象的系统中时,存在一个对象模型和关系数据库不匹配的问题。RDBMSs 用表格的形式存储数据,然而像 Java 或者 C# 这样的面向对象的语言它表示一个对象关联图。对象需要被存储和索引进表格中,第一个问题,如果我们开发了几页代码或应用程序后,需要修改数据库的设计怎么办?第二个问题,在关系型数据库中加载和存储对象时我们要面临以下五个不匹配的问题。
不匹配 | 描述 |
---|---|
粒度 | 有时你将会有一个对象模型,该模型类的数量比数据库中关联的表的数量更多 |
继承 | RDBMSs 不会定义任何在面向对象编程语言中本来就有的继承 |
身份 | RDBMS 明确定义一个 'sameness' 的概念:主键。然而,Java 同时定义了对象判等(a==b)和 对象值判等(a.equals(b)) |
关联 | 面向对象的编程语言使用对象引用来表示关联,而一个 RDBMS 使用外键来表示对象关联 |
导航 | 在 Java 中和在 RDBMS 中访问对象的方式完全不相同 |
Object-Relational Mapping (ORM) 是解决以上所有不匹配问题的方案
什么是ORM
ORM 表示 Object-Relational Mapping (ORM),是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中转换数据的技术。一个 ORM 系统相比于普通的 JDBC 有以下的优点。
- 使用业务代码访问对象而不是数据库中的表
- 从面向对象逻辑中隐藏 SQL 查询的细节
- 基于 JDBC 的 'under the hood'
- 没有必要去处理数据库实现
- 实体是基于业务的概念而不是数据库的结构
- 事务管理和键的自动生成
- 应用程序的快速开发
一个 ORM 解决方案由以下四个实体组成:
- 一个 API 来在持久类的对象上实现基本的 CRUD 操作
- 一个语言或 API 来指定引用类和属性的查询
- 一个可配置的服务用来指定映射元数据
- 一个技术和事务对象交互来执行 dirty checking, lazy association fetching 和其它优化的功能
Hibernate 概述
Hibernate 是一个高性能的对象/关系型持久化存储和查询的服务,其遵循开源的 GNU Lesser General Public License (LGPL) 而且可以免费下载。Hibernate 不仅关注于从 Java 类到数据库表的映射(也有 Java 数据类型到 SQL 数据类型的映射),另外也提供了数据查询和检索服务。
Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。
Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。
Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。
Hibernate优势
- Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
- Hibernate 不需要应用程序服务器来操作。
- 操控你数据库中对象复杂的关联。
- 最小化与访问数据库的智能提取策略。
- 提供简单的数据询问。
支持的数据库
- HSQL Database Engine
- DB2/NT
- MySQL
- PostgreSQL
- FrontBase
- Oracle
- Microsoft SQL Server Database
- Sybase SQL Server
- Informix Dynamic Server
支持的技术
Hibernate 支持多种多样的其它技术,包括以下:
- XDoclet Spring
- J2EE
- Eclipse plug-ins
- Maven