Hibernate是一个开放源代码的ORM(对象-关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命 意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

一、既然Hibernate是ORM的框架,说Hibernate,就不得不说ORM,那么什么是ORM?

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从一种形式转换到另外一种形式。

在弄明白ORM之前,要先明白以下三个概念:

1、概念模型:在软件分析阶段创建,用来模拟问题域中每一个真实实体的概念和属性,以及这些实体之间的关系。
2、域模型:在软件设计阶段创建,基于概念模型,域模型是面向对象的,由具有状态和行为的域对象(实体的抽象,类)和域对象之间的关系(类间关系)组成。
3、关系数据模型:在概念模型的基础上建立起来,描述关系数据的静态结构。

由上面的概念,我们知道,域模型和关系数据模型分别建立在概念模型的基础上,域模型是面向对象的,而关系数据模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。很显然,两种模型之间有许多不匹配之处,如下图:
 
 
ORM就是为了解决域模型和关系数据模型之间的不匹配而产生的,所以叫对象-关系映射,ORM能在任何一个java应用的业务逻辑层和数据库层之间充当桥梁,如下图:
 
 
Hibernate就是一种ORM实现,说白了就是一个ORM中间件。

参考我的博客上另外一个系列文章来看一下Hibernate是如何实现ORM的。

http://blog.csdn.net/shan9liang/article/details/8746961


二、Hibernate核心API
 
 
1、Configuration接口
Configuration类负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

2、SessionFactory接口
一个SessionFactory实例对应一个数据源,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为它需要很大的缓存存放预定义的Sql语句及映射元数据等,可以为SessionFactory配置一个缓存插件,即二级缓存。一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。SessionFactory是线程安全的。

3、Session接口
Session接口负责执行被持久化对象的CRUD操作。但需要注意的是Session对象是非线程安全的。Session也有一个缓存,成为一级缓存,缓存当前工作单位的数据。

4、Transaction接口
Transaction接口负责事务相关的操作,它对底层的事务接口做了封装,使得应用可以通过一致的Transaction接口声明事务边界,如下图:
 
 
它是可选的,开发人员也可以设计编写自己的底层事务处理代码、

5、Query和Criteria接口
Query和Criteria接口负责执行各种数据库查询,Query实例包装了一个HQL查询语句,与普通Sql的区别是,HQL查询语句是面向对象的。
Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,Criteria接口擅长执行动态查询。


Hibernate当然不仅仅这几个核心接口,还有事件处理接口,当程序通过Hibernate来加载,保存,更新或删除对象时,会触发Hibernate的拦截器或事件监听器做出相应的处理。

还有映射类型接口等等,不再过多介绍。


核心接口说完了,那么这些接口经过怎样的合作来完成一个Hibernate的基本执行流程呢?示意图:
 
 
三、本篇总结

本篇主要介绍了ORM映射以及Hibernate核心API,并用活动图表示了Hibernate一般操作的基本处理流程。

下篇继续……
 

 

浅析SSH核心原理(二)的更多相关文章

  1. 剖析SSH核心原理(一)

      在我前面的文章中,也试图总结过SSH,见 http://blog.csdn.net/shan9liang/article/details/8803989 ,随着知识的积累,总感觉以前说得比较笼统, ...

  2. SSH深度历险(七) 剖析SSH核心原理(一)

    接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问 ...

  3. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  4. 【转】diamond专题(二)– 核心原理介绍

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

  6. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  7. HDFS 核心原理

    HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...

  8. Maven 核心原理

    Maven 核心原理 标签 : Java基础 Maven 是每一位Java工程师每天都会接触的工具, 但据我所知其实很多人对Maven理解的并不深, 只把它当做一个依赖管理工具(下载依赖.打包), M ...

  9. Mybatis配置信息浅析 MyBatis简介(二)

    官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...

随机推荐

  1. 网站压力测试工具之WebBench

    1 Web Bench简介 WebBench是有名的网站压力测试工具,由Lionbridge公司开发,最多可以模拟3万个并发连接去测试网站的负载能力. Webbech能测试处在相同硬件上,不同服务的性 ...

  2. VS2008非托管C++调用wcf(WebService)服务

    在Visual Studio 2008以及以后版本中,微软停止了非托管C++的直接WebService引用.不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码, ...

  3. ASP.NET PipeLine #Reprinted#

    从ASP.NET 1.0 起,相比于ASP中的COM, PipeLine 就是一项重大的改进. ASP.NET 时代的管道模型究竟是怎么样的? 我们能接触到的四个最重要的概念就是HttpApplica ...

  4. 介绍一款开源的类Excel电子表格软件

     Excel一直以霸主的地位,占领了Windows桌面表格软件市场No 1,与此同一时候,Office套装产品差点儿成为了IT行业的标配办公技能.有无相似Excel的桌面程序,绿色版,实现主要的数 ...

  5. iOS中的图像处理(二)——卷积运算

    关于图像处理中的卷积运算,这里有两份简明扼要的介绍:文一,文二. 其中,可能的一种卷积运算代码如下: - (UIImage*)applyConvolution:(NSArray*)kernel { C ...

  6. Sublime Text 高级正则查换替换功能

    有一个需求:把某从mysql 里导出的的数据表 数据里的  Insert语句 转换成 update 语句. 须要把例如以下的语句: insert into `table` (`ID`, `code`, ...

  7. TCP/IP之DNS域名解析系统

    DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止.DNS还有一个特 ...

  8. [置顶] Linux下文件和目录权限说明

    在Linux下使用ls -l或者ll命令可以查看文件和文件夹的权限.结果显示类似于: drwxrwxrwx,这里分为四组,分别为文件类型,文件所有者的权限(读写执行),文件所有者所在组用户的权限(读写 ...

  9. .NET C#操作文件系统数据的常用方法总结 part1

    目录导航 1.0开启文件隐藏属性 1.1开启文件夹只读属性 1.2输出子文件夹路径 1.3统计文件数目 1.4批量重命名文件 1.5分割文件 1.6拼接文件 1.7读取用逗号分割的值 1.8读写压缩数 ...

  10. <转> 30 个有关 Python 的小技巧

    目录[+] 1.1 拆箱 1.2 拆箱变量交换 1.3 扩展拆箱(只兼容python3) 1.4 负数索引 1.5 切割列表 1.6 负数索引切割列表 1.7指定步长切割列表 1.8 负数步长切割列表 ...