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. 高级UNIX环境编程7 进程

    每个程序都会收到一张环境表 extern char **environ; c程序的存储空间布局: 正文段:共享,只读 初始化数据段:存函数以外的赋值 非初始化数据段(bbs):block starte ...

  2. struts.xml的配置

    <?xml version="1.0" encoding="UTF-8"?> <!--第一行必须这样写,这句话必须放在第一行--> &l ...

  3. mongodb 限制ip访问

    <pre name="code" class="python">一.限制访问IP和端口 MongoDB可以限制只允许某一特定IP来访问,只要在启动时 ...

  4. linux进程解析--进程切换

    为了控制进程的执行,linux内核必须有能力挂起正在cpu上运行的进程,换入想要切换的进程,也就是恢复以前某个挂起的进程,这就是linux的进程切换.  1进程切换的时机 一般来说,进程切换都是发生在 ...

  5. java IO回想小结

    java IO原理 IO流用来处理设备之间的传输数据 输入(input):读取外部数据(磁盘.等存储设备)到程序() (内存)中 输出(output):将程序(内存)数据输出到磁盘等存储设备 java ...

  6. ThinkPHP - 模板引擎

    1.导入css/js文件 - CSS文件 <!--<link rel="stylesheet" type="text/css" href=" ...

  7. gmake使用注意

    今天使用gmake把sgml变成html的时候出现了无法找到gmake的困惑(本人linux为ubuntu15.04),上网搜索发现: gmake是GNU Make的缩写.Linux系统环境下的mak ...

  8. Android中的TextView实现多行显示省略号

    今天遇到一个问题就是TextView显示内容的时候,多行显示的时候,显示省略号的问题,刚开始没有找到一个好的办法,只找到一个自定义TextView组件的方法,然而今天在贴吧中找到一个更好,更简便的方法 ...

  9. Android ListView两种长按弹出菜单方式

    转自:http://www.cnblogs.com/yejiurui/p/3247527.html package com.wyl.download_demo; import java.util.Ar ...

  10. Redis 突然报错 NOAUTH Authentication required

    查找相关资料,说是添加了密码 只需要在redis的配置文件redis.conf中开启requirepass就可以了,比如我设置我的访问密码是mypassword requirepass mypassw ...