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. BZOJ 1123: [POI2008]BLO( tarjan )

    tarjan找割点..不是割点答案就是(N-1)*2, 是割点的话就在tarjan的时候顺便统计一下 ------------------------------------------------- ...

  2. IOC容器初始化——BeanDefinition的Resource定位

    以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefinition.这是使用的是ClassPathResource,意味着 ...

  3. ios 面试题 经典(比较全) 根据重点总结

    史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...

  4. javascript定义函数不同方式的区别

    学习javascript中遇到了这么一个问题,代码如下: var test = 'a'; function test() { alert('Hello World!'); } alert(test); ...

  5. Qt在windows 平台操作保存execel的表格(通过QAxObject来操作)

    粗略操作 QT += core gui sql CONFIG += qaxcontainer greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #incl ...

  6. java学习之动态代理模式

    package com.gh.dynaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Metho ...

  7. MDK常见错误详解集合

    错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identi ...

  8. Android短信拦截和电话拦截

    MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import androi ...

  9. Altera FPGA中的pin简介

    第一步要看的肯定是pin planner ,这个是黑金四代EP4CE15F17C8的视图 先就是发现他们pin有不同的颜色区域,分别对应不同的bank,应该是有的设计里面要求pin在同一个bank吧( ...

  10. Python函数式编程:Lambda表达式

    首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如  a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...