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 之核心接口的更多相关文章

  1. 写出Hibernate中核心接口/类的名称,并描述他们各自的责任?

    Hibernate的核心接口一共有5个,分别为:Session.SessionFactory.Transaction.Query和 Configuration.这5个核心接口在任何开发中都会用到.通过 ...

  2. Hibernate的核心接口

    Hibernate5个核心接口 所有Hibernate应用中都会访问Hibernate的5个核心接口 Configuration接口:配置Hibernate,根启动Hibernate,创建Sessio ...

  3. Hibernate五大核心接口简介

    所有的Hibernate应用中都会访问Hibernate的5个核心接口. Configuration接口:配置Hibernate,根启动Hibernate,创建SessionFactory对象. Se ...

  4. Hibernate学习笔记(4)---hibernate的核心接口

    Configuration类 该类主要是读取配置文件,启动hibernate,并负责管理hibernate的配置信息,一个程序只创建一个Configuration对象. Configuration类操 ...

  5. hibernate学习系列-----(2)hibernate核心接口和工作机制

    在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...

  6. Hibernate(三)__核心接口和类

    该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...

  7. hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。

    hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate. ...

  8. Hibernate详解(5)——Hibernate核心接口和工作原理

    Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...

  9. 深入解析Hibernate核心接口

    Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...

随机推荐

  1. Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转

    ylbtech-Java-Runoob-高级教程-实例-字符串:05. Java 实例 - 字符串反转 1.返回顶部 1. Java 实例 - 字符串反转  Java 实例 以下实例演示了如何使用 J ...

  2. Bootstrap-Plugin:按钮(Button)插件

    ylbtech-Bootstrap-Plugin:按钮(Button)插件 1.返回顶部 1. Bootstrap 按钮(Button)插件 按钮(Button)在 Bootstrap 按钮 一章中介 ...

  3. oracle 跨库访问

    创建DBLINK的方法: 1. create public database link dblink connect to totalplant identified by totalplant us ...

  4. 接口自动化(三)--读取json文件中的数据

    上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 cla ...

  5. ES6系列_6之新增的数组知识

    1.JSON数组格式转换 JSON的数组格式就是为了前端快速的把JSON转换成数组的一种格式,json数组格式如下: let json = { '0': '男', '1': '女', length:3 ...

  6. C#实现图片文件到数据流再到图片文件的转换

    //----引入必要的命名空间using System.IO;using System.Drawing.Imaging; //----代码部分----// private byte[] photo;/ ...

  7. leetcode203

    /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...

  8. 迷你MVVM框架 avalonjs 学习教程5、显示隐藏控制

    今天的主角是ms-visible,它的效果类拟于jQuery的toggle,如果它后面跟着的表达式为真值时则显示它所在的元素,为假值时则隐藏.不过显示不是 display:none这么简单,众所周知, ...

  9. angular性能优化心得

    原文出处 脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后 ...

  10. Django+python实现网页数据的excel导出

    一直都想做一个网页的excel导出功能,最近抽时间研究了下,使用urllib2与BeautifulSoup及xlwt模块实现 urllib2这个模块之前有用过,关于BeautifulSoup模块,可参 ...