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. java 自定义BufferedReader_readLine

    import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import ...

  2. HTML5 标准属性 NEW:HTML 5 中新的标准属性。 注释:HTML 4.01 不再支持 accesskey 属性:

    属性 值 描述 accesskey character 规定访问元素的键盘快捷键 class classname 规定元素的类名(用于规定样式表中的类). contenteditable true f ...

  3. C# Programming Study #1

    引用的时候需要在参数和使用的时候加上 ref 关键字 static bool addnum (ref int val) //引用 { ++val; return true; } 参数数组的概念,可以接 ...

  4. 羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)

    三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal.问题名字来自该节目的主持人蒙提·霍尔(Mon ...

  5. ASP.NET CS文件中输出JavaScript脚本

    ClientScript.RegisterStartupScript:http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscrip ...

  6. cocos2dx进阶学习之CCLayer

    继承关系 CCLayer -> CCNode,CCTouchDelegate,CCAccelerometerDelegate,CCKeypadDelegate CCLayer在cocos2dx中 ...

  7. 枚举子集的3种方式 -- C++描述

    要求: 给定一个集合,枚举所有可能的子集.此处的集合是不包含重复元素的. Method0: 增量构造法 思路:每次选取一个元素至集合中,为了避免枚举重复的集合,此处要采用定序技巧 -- 除了第一个元素 ...

  8. Linux 各类软件整理汇总

    关于前端和后端的解释 详细链接见:http://wiki.ubuntu.org.cn/Qref/Apps Linux下程序通常不需要作为一个整体,而是模块化,于是有了可选的前端和后端——这种情况下:前 ...

  9. 计算闰年_winform

    新建窗体应用程序(如下),新建控件label1,label2,label3,textBOX1,button1,button2 label1的Text属性改为“计算闰年演示” label2的Text属性 ...

  10. ViewPager+View实现Tab

    注:源码来自慕课网. 使用ViewPager+View实现Tab底部导航: 主要思想:顶部top.xml,中间ViewPager,底部线性布局Tab导航. top.xml具体实现: <?xml ...