一、Hibernate中的对象状态

  1.1、瞬时态(临时态)

    没有与Hibernate产生关联

    与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应)   

      获得:一般都只直接创建(new)
      瞬时态 转换 持久态
        一般操作:save方法、saveOrUpdate
      瞬时态 转换 脱管态
        一般操作:通过setId方法设置数据

   1.2、持久态

    Hibernate有关联

    对象有id

      获得:
        查询操作:get、loat、createQuery、createCriteria 等 获得都是持久态【】
        执行save之后持久态
        执行update之后持久态
      持久态 转换 瞬时态
        官方规定执行delete() --民间:删除态
      持久态 转换 脱管态
        session没有记录
        session.close () 关闭
        session.clear() 清除所有
        session.evict(obj) 清除指定的PO对象

  1.3、游离态(脱管态)

    没有与Hibernate产生关联

    对象有ID

      获得:
        创建、并设置OID的
        通过api获得
      脱管态 转换 瞬时态
        手动去除OID,设置成默认值
      脱管态 转换 持久态
        一般操作:update()、saveOrUpdate

  1.4、在代码中去查看三种状态

    

  1.5、三种状态的相互转换

    1.5.1、瞬时转化为持久

    

      注意:如果主键生成策略中value是assigned需要自己指定主键,不指定会报错。

    1.5.2、瞬时转化为游离  

        在数据库中id=1中已经存在有

        

        

    1.5.3、持久转化为瞬时

      

      方式二:

          

    1.5.4、持久转化为游离

      

    1.5.5、游离转化为瞬时

      

    1.5.6、游离转化为持久

      

  1.6、三种状态有什么用处?

    持久状态,我们使用Hibernate主要是为了持久化我们的数据.

    对于对象的状态,我们期望我们需要同步到数据库的数据,都被装换成持久状态

    持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中.  

    

二、一级缓存

    又称为session级别的缓存。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(PO对象),为程序优化服务,

    如果之后需要相应的数据,hibernate优先从session缓存中获取,如果有就使用;如果没有再查询数据库。当session关闭时,一级缓存销毁。

  在Hibernate中存在两种缓存:一是线程级别的缓存(session缓存)二是进程级别的缓存(二级缓存)

  缓存:用来提高效率的

    session缓存:就是session对象中存在的缓存,缓存中存在的是(持久化)对象。

  2.1、证明session缓存的存在

    

    我们用图形来理解:

      

  2.2、一级缓存快照

        在从数据库取数据时,会将数据一式两份,一份作为缓存中的对象,一份作为快照,在session提交时做对比。

      快照:与一级缓存一样的存放位置,对一级缓存数据备份。保证数据库的数据与 一级缓存的数据必须一致。如果一级缓存修改了,

          在执行commit提交时,将自动刷新一级缓存,执行update语句,将一级缓存的数据更新到数据库。

        

          

    举例:

      

    我们画图来分析一下: 

          

        

      持久化状态: 本质就是存在缓存中的对象,就是持久化状态.

  2.3、感受一级缓存带来的效率

      感受一:

    

      从上面这三行代码中,我们u1执行需要执行一条sql语句,我们执行得到u2和u3时,发现不会去再次查询,而是从缓存中找。

      感受二:

        

        从上面代码还在那个我们知道,第一个u1中会执行select语句。当事务还没有提交的时候,只会在缓存中进行。

        所以总的只会产生两条sql语句。

  2.4、一级缓存中的细节问题

    问题一:保存对象时,可以使用save方法和persist方法,他们之间有区别吗?

        没有区别,功能上是一样的。但persist(持久) 方法 来自于JPA 接口。而save(保存) 方法来自于Hibernate。

    问题二:HQL查询是否会使用一级缓存?

        HQL不会使用一级缓存.

    

    问题三:HQL语句批量查询时,查询结果是否会进入缓存?

        查询结果会放入缓存中

    

    问题四:SQL查询 结果会不会放入1级缓存中?

        如果把查询结果封装到对象中,对象会放入一级缓存

      

    问题五:SQL查询 结果会不会放入1级缓存中?

        没有把查询结果封装到对象中,对象不会放入一级缓存

          

    问题六:criteria  会将查询结果放入一级缓存. 但是查询不会使用一级缓存. 与Hql查询结论一致.    

    

    

    

    

  

    

      

    

    

    

Hibernate(四)之对象状态及一级缓存的更多相关文章

  1. hibernate学习(5)——对象状态与一级缓存

    1.对象状态 1.1   状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...

  2. Hibernate第七篇【对象状态、一级缓存】

    前言 本博文主要讲解Hibernate的细节-->对象的状态和一级缓存- 对象状态 Hibernate中对象的状态: - 临时/瞬时状态 - 持久化状态 - 游离状态 学习Hibernate的对 ...

  3. Hibernate框架学习(三)——实体规则、对象状态、一级缓存

    一.Hibernate中的实体规则 1.实体类创建的注意事项 1)持久化类提供无参数构造,因为在Hibernate的底层需要使用反射生成类的实例. 2)成员变量私有,提供公有的get和set方法,需提 ...

  4. hibernate框架学习第三天:对象状态、一级缓存、快照等

    对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...

  5. 【Hibernate】持久化对象状态及以及缓存

    一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...

  6. Hibernate[延迟加载] [三种状态] [脏检查] [缓存机制]

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  7. Hibernate中的对象状态,及自动更新原因

    Hibernate的对象有三种状态,分别为:瞬时状态 (Transient). 持久化状态(Persistent).游离状态(Detached).对它的深入理解,才能更好的理解hibernate的运行 ...

  8. Hibernate中的对象状态,及自动更新原因,Hibernate set对象后不调用update却自动更新

    原文:http://www.cnblogs.com/xiaoda/p/3225617.html Hibernate的对象有三种状态,分别为:瞬时状态 (Transient). 持久化状态(Persis ...

  9. hibernate学习(三) hibernate中的对象状态

    hibernate对象的状态分为三种:  游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration   cfg=new Configuration().configure(); ...

随机推荐

  1. Algorithms(4th)谢路云译大纲总结(附实现源码)

    前言: 此算法书可以说是Java程序开发者的福音.里面涉及近50种计算机领域的经典算法,几位作者花了近40年的时间才完成这本著作.秉着对作者的敬仰与对算法的兴趣,我多次翻阅此书,而且常常被书中的经典算 ...

  2. Dapper C# 访问SQLite

    1.以操作SQLite为例.先下载Dapper,项目引用添加Dapper.dll,然后入下 SQLiteConnectionStringBuilder sb = new SQLiteConnectio ...

  3. jsp判断为空用not empty

    试过 !='' 不管用,只好百度,现在知道了 <c:if test="${not empty pos.requireDegreeName }"> ${pos.requi ...

  4. Struts2环境的搭建

    1. Struts2 获取http://struts.apache.org/download.cgiStruts-2.3.16.3-all.zip 了解主要目录 apps :该文件夹下包含了基于Str ...

  5. h5标签基础 table表格标签

    一.表格的定义:用于有规范的显示数据. 二.基本组成: 行<tr>/列<td>/表头<caption>/表标题<th> eg: <table> ...

  6. 服务器数据库搭建流程(CentOs+mysql)

    前言: 服务器上数据库搭建需要知道Linux系统的版本,以前的Ubuntu14.04直接在终端下输入apt-get install (package)便可方便的下载并安装mysql,但是在centOs ...

  7. Http远程调用服务

    GET public static string GetJsonStr(string webApi)        {            string serviceAddress = webAp ...

  8. 1671: [Usaco2005 Dec]Knights of Ni 骑士

    1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 254  Solved: 163 ...

  9. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  10. Calender设置固定时间遇到的问题

    在使用Calender获取实例,设置成UTC时区时,发现比我们常规的月份多了一个月: 示例代码如下: Calendar calendar = Calendar.getInstance(TimeZone ...