Hibernate 之核心接口
1.持久化和ORM
持久化是指把数据(内存中的对象)保存到可持久保存的存储设备中(如硬盘),主要应用于将内存中的数据存储到关系型数据库中,在三层结构中,持久层专注于实现系统的逻辑层面,将数据使用者与数据实体进行关联。
ORM简称对象-关系型数据映射,在编写程序时,处理数据采用面向对象的方式,保存数据却以关系型数据库的方式,因此需要一种能在两者之间进行转换的机制。这种机制称为ORM。ORM保存了对象和关系型数据库表的映射信息。Hibernate映射信息保存在XML格式的配置文件中。
2 Hibernate 核心接口框图

2.1 Configuration类
在启动Hibernate的过程中,Configuration实例首先确定映射文件hibernate.cfg.xml的位置,读取相关的配置信息,最后创建一个唯一的SessionFactory实例,这个唯一的SessionFactory实例负责进行所有的持久化操作。Configuration类的实例只存在于系统的初始化阶段。
2.2 SessionFactory接口
SessionFactory接口负责Hibernate的初始化。具体来说,在Hibernate中SessionFactory实际上起到了一个缓冲区的作用,Hibernate 自动生成的SQL语句,映射数据以及某些可重复利用的数据都可放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护当前的二级数据缓存和Statement Pool。
一般情况下,一个项目只需要一个SessionFactory,但当项目中要操作多个数据库时,则必须为每个数据库指定一个SessionFactory。
2.2.1 openSession方法和getCurrentSession方法的主要区别
在创建Session实例时,采用openSession,SessionFactory创建的是一个新的Session实例。而getCurrentSession方法创建的Session实例会被绑定到当前线程中。采用openSession方法,在使用完后需要显示调用close方法进行手动关闭。而getCurrentSession方法创建的Session实例则会在提交(commit)或回滚(rollback)操作时自动关闭。
2.3 Session接口
Session对象的生命周期以Transaction对象的事物开始和结束为边界。Session提供了一系列与持久化相关的操作,如读取,创建和删除相关实体对象的实例,这一系列的操作最终将被转换为对数据库中数据的增加,修改,查询和删除操作。所以,Session也被称为持久化管理器。
2.3.1 实体对象的生命周期
对象在生命周期中所处的状态有:瞬时态(Transient),持久态(Persistent)和游离态(Detached)。同一个实体对象进行不同的操作后其状态会进行相互转换。
(1)瞬时态
利用new操作符实例化后的对象所处的状态即为瞬时态,这时还没有存入任何数据库表中。一旦他们不再被其他对象引用时,状态立即丢失,且不能再被访问,只能等待垃圾回收。
(2)持久态
持久态对象与Session实例是相关的,对持久态对象所做的任何操作都将被Hibernate持久化到数据库中。持久态对象总和数据库中的记录相对应,Session对缓存做清理时,会依据持久态对象属性的变化,来同步的更新数据库。当session执行delete()方法时,不仅会从数据库中删除与之对应的记录,还会把它从session的缓存中删除。
(3)游离态
当处于持久态的对象不再与Session实例相关时,该对象就变成了游离态。此时对象中的属性值发生变化,Hibernate不会再将变化同步到数据库中。对于游离态的对象,Session执行delete()方法会从数据库中删除与之对应的记录。游离态与瞬时态的不同在于游离态是有持久态转换来的,因此在数据库还保存有对应的记录,而瞬时态在数据库中是不存在任何记录和它对应的。
2.3.2 使对象进入持久态的方法
update(),saveOrUpdate()和lock()方法可以将游离态对象转换为持久态对象。与save()方法类似,在调用update()方法后,被保存的对象不是立刻就同步到数据库,只有当事物结束的时候才会将实体对象当前的属性值更新到数据库中,不过当需要执行新的同表查询时,为得到准确的查询结果,就需要及时对数据库进行更新。若一个持久态对象与一个瞬时态对象关联,则在允许级联保存的情况下,Session会在清理缓存时将瞬时态对象转换为持久态对象。
saveOrupdate()方法根据实体对象的状态由Hibernate来决定使用什么方法,当传入实体对象是瞬时态时,执行save()操作;当传入是游离态时,执行update()方法;当传入对象为持久态时直接返回,不进行任何操作。
load()方法或者get()方法都是通过标识符的到指定类的持久态对象(需要类型强转),但要求持久化对象必须存在,否则会产生异常。两者的区别在于:
(1)当所查找的记录不存在时,get()方法会返回null,而load()方法则会抛出HibernateException 异常。
(2) get()方法直接返回实体类,load()方法则返回实体的代理类实例。当然,如果将*.hbm.xml中<class>元素的lazy属性设置为false是,则load()方法 也是返回实体类,不返回代理类。而lazy属性是有什么用呢,他表示延迟加载,即当真正需要属性时,才执行真正的数据加载操作,这样做可以降低系统的性能开销。 当lazy()设置为true时,load()返回持久化对象的代理类实例,该代理类实例是在运行时动态生成的,它包括了目标对象的所有属性和方法。但是由于采用了延迟加载,此 代理实例的属性中除了id属性其他都为NULL,只有当代理类实例调用getXXX()方法时,Hibernate才真正到数据库中获得属性值。
(3)load()和get()都是从Session内部缓存中开始查找指定对象,如果没有找到,load()会去Hibernate二级缓存查询,若还未找到,则会发送一条SQL 语句到数据库中进行查询,并根据查询结果生成相应的实体对象。而get()会越过二级缓存,直接发出SQL语句到数据库中完成数据读取。
本文均为自己一字一句整理得到,如果你觉得还不错,请关注我或点赞,至于Query,Criteria和Transaction接口会在接下来的Hql实例讲解博客中再作介绍,谢谢观看!
---------参考资料《Java Web整合开发实战》《Struts2+Spring3+Hibernate框架技术精讲与整合案例》
Hibernate 之核心接口的更多相关文章
- 写出Hibernate中核心接口/类的名称,并描述他们各自的责任?
Hibernate的核心接口一共有5个,分别为:Session.SessionFactory.Transaction.Query和 Configuration.这5个核心接口在任何开发中都会用到.通过 ...
- Hibernate的核心接口
Hibernate5个核心接口 所有Hibernate应用中都会访问Hibernate的5个核心接口 Configuration接口:配置Hibernate,根启动Hibernate,创建Sessio ...
- Hibernate五大核心接口简介
所有的Hibernate应用中都会访问Hibernate的5个核心接口. Configuration接口:配置Hibernate,根启动Hibernate,创建SessionFactory对象. Se ...
- Hibernate学习笔记(4)---hibernate的核心接口
Configuration类 该类主要是读取配置文件,启动hibernate,并负责管理hibernate的配置信息,一个程序只创建一个Configuration对象. Configuration类操 ...
- hibernate学习系列-----(2)hibernate核心接口和工作机制
在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...
- Hibernate(三)__核心接口和类
该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...
- hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。
hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate. ...
- Hibernate详解(5)——Hibernate核心接口和工作原理
Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...
- 深入解析Hibernate核心接口
Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...
随机推荐
- 第3课 QT的诞生和本质
1. GUI用户界面元素 (1)操作系统提供了创建用户界面元素所需要的函数 (2)各种功能不同的函数依次调用,从而创建出界面元素 (3)操作系统提供的原生函数无法直接映射到界面元素 2. 面向对象的G ...
- selenium webdriver——JS操作日历控件
一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 比如 但是,有的日期控件是readonly的 比如12 ...
- Group By 和Having总结
1.Group By 概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组 所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. ...
- 字符串转码 将文本转为PDF
@Test public void testBasic64Code() throws Exception { String strdata = new String("how are you ...
- 用VB6.0实现串口通信
Then ' 1位或2位 'byte 类型取值范围为 0-255 ,不能为-1 = ) & ) End IfstrHe ...
- 阻止后续事件的发生 onclick 双return 事件绑定(..$).click一个return
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js 和 java互调
Java调JS JDK1.8 中Nashorn 比JavaScript性能更好 public static void main(String[] args) { long s = System.cur ...
- 如何在ArcMap中监听键盘鼠标事件(转)
如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...
- readonly const
readonly:只读域,只能在初始化--声明初始化或构造器初始化--的过程中赋值,其他地方不能进行对只读域的赋值操作,否则编译器会报错.只读域可以是实例域也可以是静态域.只读域的类型可以是C#语言的 ...
- node升级更新最近稳定版
今天,又发现一个超级简单的升级Node.js的方法.一行命令搞定,省去了重新编译安装的过程. node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: ...