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」:Berkeley DB的JAVA连接

    Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...

  2. Identifiers

    Identifier An identifier is an arbitrarily long sequence of digits, underscores, lowercase and upper ...

  3. android 判断网络连接的工具类

    package com.way.util; import android.content.Context; import android.net.ConnectivityManager; import ...

  4. sublime快捷方式和node.js

    快捷方式具体见:http://blog.useasp.net/archive/2013/06/14/sublime-text-2-all-default-Shortcuts-table-on-wind ...

  5. pl/sql 中F8执行单行sql

    pl/sql中设置: tools->preferences->sql window->AutoSelect statement

  6. Android 开发 AirPlay Server

    安卓上开发  AirPlay Server  主要是参考了和修改了 DroidAirPlay项目 , 和Airplay 协议 1, 将DroidAirPlay 下载下来 2, Eclipse 新建一个 ...

  7. ZOJ 3331 Process the Tasks 双塔Dp

    用dp[i][j]表示当前安排好了前i个任务,且机器A和机器B完成当前分配到的所有任务的时间差为j(这里j可正可负,实现的时候需要加个offset)时,完成这些任务的最早时间.然后根据j的正负,分别考 ...

  8. 原生弹窗拖拽代码demo+简单的抽奖

    拖拽效果 效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  9. Struts 2 OGNL

    1.什么是OGNL? 2.Struts 2 OGNL 表达式      ======================  华丽丽的分割线  ======================  1.什么是OG ...

  10. php unset 数组陷阱

    我们删除一个array, unset($arr); 想删除某个元素 unsert($arr[i]) 一个陷阱是: unset() 函数允许删除数组中的某个键.但要注意数组将不会重建索引.如果需要删除后 ...