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 ...
随机推荐
- 为Web页中的Table对象创建一个映射表
HTML对象中的TABLE是我们常用的网页元素,在DHTML编程中,我们可以通过它的rows和cells方法方便的访问表格对象里面的每一个单元格,而且表格对象(table)的每个单元行(tr)和每个单 ...
- [ML] CostFunction [Octave code]
function J = computeCostMulti(X, y, theta) m = length(y); % number of training examples J = 0; for i ...
- Excel2013复制内容粘贴到刷选的数据表中
如何将复制内容粘贴到筛选后表格中: 1.需要一个表格:我要把这个表格里姓名列不包含A的项改为另外一个表中的数据列: 2.在姓名右侧插入两列,列A.列B: 3.在列A下第一格输入1,向下序列填充: 4. ...
- Java内存分配及值、引用的传递
关于堆栈的内容网上已经有很多资料了,这是我找的加上自己理解的一篇说明文: 一.内存区域类型 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制: 2. 栈:存放基本类型的变量数 ...
- c#,条码
static void Generate2(string text){ BarcodeWriter writer = new BarcodeWriter(); //使用ITF 格式,不能被现在常用的支 ...
- C#实现图片文件到数据流再到图片文件的转换
//----引入必要的命名空间using System.IO;using System.Drawing.Imaging; //----代码部分----// private byte[] photo;/ ...
- leetcode890
public class Solution { public string ConvertString(string pattern) { var dic = new Dictionary<ch ...
- python 发送带附件的 邮件
from email.MIMETextimportMIMETextfrom email.MIMEMultipartimportMIMEMultipartimport smtplib mail_host ...
- axure学习点
动态模板内部框架动态弹出框
- struts2下velocity做视图如何访问request,session等内置对象,如:原来webwork的$req
struts2下velocity做视图如何访问request,session等内置对象(转) velocity 内置对象 struts2 requestStruts2环境下用velocity做视图时访 ...