• hibernate&三种状态的对象&一级缓存&快照机制


    持久化类概述

    1. Hibernate的持久化类
    持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
    持久化类 = Java类 + hbm的配置文件



    持久化对象的三种状态

    Hibernate的持久化类的状态
    Hibernate为了管理持久化类:将持久化类分成了三个状态


    瞬时态:Transient  Object
    没有持久化标识OID, 没有被纳入到Session对象的管理.

    持久态:Persistent Object
    有持久化标识OID,已经被纳入到Session对象的管理.

    脱管态:Detached Object
    有持久化标识OID,没有被纳入到Session对象的管理.


    ## 持久化类概述 ## 1. Hibernate的持久化类  持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.  持久化类 = Java类 + hbm的配置文件    ## 持久化对象的三种状态 ## Hibernate的持久化类的状态 Hibernate为了管理持久化类:将持久化类分成了三个状态  瞬时态:`Transient  Object`   没有持久化标识OID, 没有被纳入到Session对象的管理.     持久态:`Persistent Object`   有持久化标识OID,已经被纳入到Session对象的管理.     脱管态:`Detached Object`   有持久化标识OID,没有被纳入到Session对象的管理.  ![持久化对象的三种状态 ][1] ## Hibernate持久化对象的状态的转换 ##  - `瞬时态-- 没有持久化标识OID, 没有被纳入到Session对象的管理`  获得瞬时态的对象   User user = new User()  瞬时态对象转换持久态   save()/saveOrUpdate();  瞬时态对象转换成脱管态   user.setId(1)   - `持久态-- 有持久化标识OID,已经被纳入到Session对象的管理`  获得持久态的对象   get()/load();  持久态转换成瞬时态对象   delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)  持久态对象转成脱管态对象   session的close()/evict()/clear();   - `脱管态-- 有持久化标识OID,没有被纳入到Session对象的管理`  获得托管态对象:不建议直接获得脱管态的对象.   User user = new User();   user.setId(1);  脱管态对象转换成持久态对象   update();/saveOrUpdate()/lock();  脱管态对象转换成瞬时态对象   user.setId(null);   - `注意:持久态对象有自动更新数据库的能力!!!`  ![Hibernate持久化对象的状态的转换][2]  代码演示: 持久态对象有自动更新数据库的能力  ![持久态对象有自动更新数据库的能力][3]  ## Session对象的一级缓存 ## 1. 什么是缓存?  其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!   2. Hibernate框架提供了两种缓存  一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.  二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.   3. Session对象的缓存概述  Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着  内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!   4. 证明一级缓存的存在,编写查询的代码即可证明  在同一个Session对象中两次查询,可以证明使用了缓存   5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?  使用get方法查询User对象  然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。  利用快照机制来完成的(SnapShot)  测试一级缓存: ![一级缓存][4]  ## 控制Session的一级缓存 ## 学习Session接口中与一级缓存相关的方法  Session.clear()   -- 清空缓存。  Session.evict(Object entity) -- 从一级缓存中清除指定的实体对象。  Session.flush()   -- 刷出缓存(原本是提交事务才缓存比较快照,flush刷新会提前比较)  ## 快照机制 ## ![快照机制][5]     [1]: http://www.suyibk.top/usr/uploads/2018/04/1565016060.jpg   [2]: http://www.suyibk.top/usr/uploads/2018/04/2012776169.png   [3]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png   [4]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png   [5]: http://www.suyibk.top/usr/uploads/2018/04/181361271.png

    Hibernate持久化对象的状态的转换

     - 瞬时态-- 没有持久化标识OID, 没有被纳入到Session对象的管理
    获得瞬时态的对象
    User user = new User()
    瞬时态对象转换持久态
    save()/saveOrUpdate();
    瞬时态对象转换成脱管态
    user.setId(1)
     - 持久态-- 有持久化标识OID,已经被纳入到Session对象的管理
    获得持久态的对象
    get()/load();
    持久态转换成瞬时态对象
    delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
    持久态对象转成脱管态对象
    session的close()/evict()/clear();
     - 脱管态-- 有持久化标识OID,没有被纳入到Session对象的管理
    获得托管态对象:不建议直接获得脱管态的对象.
    User user = new User();
    user.setId(1);
    脱管态对象转换成持久态对象
    update();/saveOrUpdate()/lock();
    脱管态对象转换成瞬时态对象
    user.setId(null);
     - 注意:持久态对象有自动更新数据库的能力!!!


    ![Hibernate持久化对象的状态的转换][2]


    代码演示: 持久态对象有自动更新数据库的能力


    ![持久态对象有自动更新数据库的能力][3]


    Session对象的一级缓存

    1. 什么是缓存?
    其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!

    2. Hibernate框架提供了两种缓存
    一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.
    二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.

    3. Session对象的缓存概述
    Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着
    内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!

    4. 证明一级缓存的存在,编写查询的代码即可证明
    在同一个Session对象中两次查询,可以证明使用了缓存

    5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?
    使用get方法查询User对象
    然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。
    利用快照机制来完成的(SnapShot)


    测试一级缓存:
    ![一级缓存][4]


    控制Session的一级缓存

    学习Session接口中与一级缓存相关的方法
    Session.clear() -- 清空缓存。
    Session.evict(Object entity) -- 从一级缓存中清除指定的实体对象。
    Session.flush() -- 刷出缓存(原本是提交事务才缓存比较快照,flush刷新会提前比较)


    快照机制

    ![快照机制][5]
  • 相关阅读:
    【7】用Laravel5.1开发一个简单的博客系统
    【6】Laravel5.1的migration数据库迁移
    【5】说说Laravel5的blade模板
    【4】优化一下【3】的例子,顺便说说细节
    【3】创建一个简单的Laravel例子
    【2】最简单的Laravel5.1程序分析
    【1】Laravel5.1 安装
    【0】Laravel 5.1 简介
    MySQL常用命令
    Windows8.1使用博客客户端写博客
  • 原文地址:https://www.cnblogs.com/sybk/p/10004739.html
Copyright © 2020-2023  润新知