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


    前言

    本博文主要讲解Hibernate的细节—->对象的状态和一级缓存

    对象状态

    Hibernate中对象的状态:
    - 临时/瞬时状态
    - 持久化状态
    - 游离状态

    学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础…当然啦,也就一点点知识

    临时/瞬时状态

    当我们直接new出来的对象就是临时/瞬时状态的..

    • 该对象还没有被持久化【没有保存在数据库中】
    • 不受Session的管理

    这里写图片描述

    持久化状态

    当保存在数据库中的对象就是持久化状态了

    • 当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态
    • 在数据库有对应的数据
    • 受Session的管理
    • 当对对象属性进行更改的时候,会反映到数据库中!

    这里写图片描述

    我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!

    
            session.save(idCard);
            idCard.setIdCardName("我是测试持久化对象");
    

    这里写图片描述

    游离状态

    当Session关闭了以后,持久化的对象就变成了游离状态了…

    • 不处于session的管理
    • 数据库中有对应的记录

    这里写图片描述


    一级缓存

    Hibernate有一级缓存和二级缓存之分,这里主要讲解一级缓存

    什么是一级缓存?

    Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!

    只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!

    Session的缓存由hibernate维护,用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作

    为什么要是使用缓存?

    减少对数据库的访问次数!从而提升hibernate的执行效率!

    测试

    我们来看一下Hibernate是怎么减少对数据库访问的次数的。

    现在我的User表有这么一条记录:

    这里写图片描述

            //把数据放进cache
            User user = (User) session.get(User.class, 1);
    
            //发现要修改的字段和cache一样,不执行
            user.setUserName("你好2");

    这里写图片描述

    这里写图片描述

    取数据也是一样的

    
            User user = null;
            user = (User) session.get(User.class, 1);
            user = (User) session.get(User.class, 1);
    

    这里写图片描述


    缓存相关的方法

    和缓存有关常用的方法有三个:

    • session.flush(); 让一级缓存与数据库同步
    • session.evict(arg0); 清空一级缓存中指定的对象
    • session.clear(); 清空一级缓存中缓存的所有对象

    • clear

    
            User user = null;
            user = (User) session.get(User.class, 1);
    
            //清除缓存,那么下面获取的时候,就不能从缓存里面拿了
            session.clear();
            user = (User) session.get(User.class, 1);
    
    • flush

    在有缓存的情况下,修改同一条记录的数据,以最后的为准…因此只有一条update

    
            User user = null;
            user = (User) session.get(User.class, 1);
    
            user.setUserName("我是第一");
            user = (User) session.get(User.class, 1);
            user.setUserName("我是第二");
    

    这里写图片描述

    我让强制让它和数据库同步的话,就有两条update了

            User user = null;
            user = (User) session.get(User.class, 1);
    
            user.setUserName("我是第一");
            session.flush();
            user = (User) session.get(User.class, 1);
            user.setUserName("我是第二");
    

    这里写图片描述

    一般地,我们在批处理的时候会用,因为缓存也是有大小的,如果1000条数据插入进去都要缓存,那么Hibernate可能就崩了

    • 每隔一定记录数,先与数据库同步 flush()
    • 再清空缓存 clear()

    值得注意的是:不同的Session是不会共享缓存的!

    Iterator与list

    我们使用HQL查询全部数据的时候,可以使用list()得到所有的数据,也可以使用iterator()得到一个迭代器,再遍历迭代器…那它们有什么区别呢?

    。。。。当时看视频的时候说是下图:

    这里写图片描述

    但是我在测试的时候:List也可以获取缓存的数据

    这里写图片描述

    当然啦,Iterator也是可以获取缓存的数据

    这里写图片描述

    因此,在获取数据的时候还是使用list()方便!

  • 相关阅读:
    趣谈编程史第4期-饱受争议的前端之王JavaScript的血泪成长史
    趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普
    趣谈编程史第1期-跌宕起伏的java帝国史,剖析谷歌甲骨文长达8年的版权战争
    记录一次Metaspace扩容引发FGC的调优总结
    多线程学习笔记-深入理解ThreadPoolExecutor
    使用CompletableFuture优化你的代码执行效率
    Linux+Shell常用命令总结
    Guava Cache探索及spring项目整合GuavaCache实例
    将List按照指定大小等分的几种实现方式和效率对比及优化
    Spring的事件机制详解
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202964.html
Copyright © 2020-2023  润新知