一、Hibernate中实体类的三种状态

  1、瞬时态

      该状态下实体类对象的id属性没有值,该对象和session也没有关系。

      实例:

  1.      UserEntity user = new UserEntity();
  2. user.setName("jack");
  3. user.setPwd("123");
  4. user.setScore(98.5f);

  2、持久态

      该状态下,实体类的对象的id属性有值,该对象和session也有关系。

      实例:

  1. UserEntity userEntity =session.get(UserEntity.class, 1);

  3、托管态

       该状态下;实体类的对象的id有值,但是和session没有关系。

       实例:

      

  1. UserEntity userEntity = new UserEntity();
  2. userEntity.setUid(1);

二、Hibernate的缓存

    1、什么是缓存

        数据一般情况下存在数据库中,数据库本身是文件系统,存储在硬盘中,要读取该数据需要使用流,这样访问效率不是很高。

        缓存就是把数据保存在内存中,这样就可以直接读取,提高访问速度。

    2、Hibernate缓存分类

        在Hibernate中,有一级缓存和二级缓存。

        (1)Hibernate的一级缓存特点:

          • 默认打开,不需要额外配置,直接使用。
          • 有使用的范围,该范围就是session对象的范围,从session对象被创建开始,到session对像关闭结束
          • 缓存中存储的数据必须是持久态的数据。 

        (2)代码验证一级缓存的存在

              原理:多次去查询同一条记录,如果访问了数据库就会在控制台打印出底层的sql语句,通过观察输

                 出,就可以验证该缓存的存在

              代码:

  1.     @Test
  2. public void Test6(){
  3. SessionFactory sessionFactory = HibernateUtils.getFactory();
  4. Session session = sessionFactory.openSession();
  5. Transaction tx = session.beginTransaction();
  6. UserEntity userEntity1 = session.get(UserEntity.class, 2);
  7. System.out.println(userEntity1);
  8. UserEntity userEntity2 = session.get(UserEntity.class, 2);
  9. System.out.println(userEntity2);
  10. tx.commit();
  11. session.close();
  12. sessionFactory.close();
  13. }

              验证结果:

         (3)一级缓存的执行过程

           在查询时,首先去一级缓存中查找该数据,如果有直接将数据组装成一个新对象返回,如果没有该数据,则去数据库中查询该数据

           查询成功后将该数据保存到一级缓存(不保存对象,而是保存该对象的值),然后在返回本地,对二次查询该数据时,再去一级缓存中

           根据id对比数据,该数据已存在,则将该数据组装成一个新对象返回,过程见下图。

          

  

          (4)一级缓存的特性

            特性:持久态会自动更新数据库

            验证方式:根据id去查询一个记录,然后修改该记录,修改后不执行update()方法,提交事物。

            验证代码:

              

  1. @Test
  2. public void Test7(){
  3. SessionFactory sessionFactory = HibernateUtils.getFactory();
  4. Session session = sessionFactory.openSession();
  5. Transaction tx = session.beginTransaction();
  6. UserEntity userEntity1 = session.get(UserEntity.class, 2);
  7. userEntity1.setPwd("asddfff");
  8. tx.commit();
  9. session.close();
  10. sessionFactory.close();
  11. }

            验证结果:

            

            该特性的原理与过程:

              一级缓存在存储数据时会创建一个数据的快照,在提交事务时,会去对比缓存中数据和快照区的数据,如果数据不同,就会去更新数据

              库的数据。

      (5)Hibernate的二级缓存

        • 默认关闭,需要通过配置文件配置才能开启。
        • 目前已经放弃使用,使用redis技术替代。
        • 使用的范围是sessionfactory的范围。                

实体类的状态与Hibernate缓存的更多相关文章

  1. Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态

    Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...

  2. Hibernate第二天——实体类 与缓存机制

    第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...

  3. 06.Hibernate实体类生命周期

        前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度 ...

  4. Hibernate 缓存介绍

    Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...

  5. hibernate缓存机制详细分析 复制代码 内部资料 请勿转载 谢谢合作

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  6. hibernate缓存机制详细分析

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级 ...

  7. 10.hibernate缓存机制详细分析(转自xiaoluo501395377)

    hibernate缓存机制详细分析   在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论 ...

  8. 【转载】hibernate缓存机制

    一级缓存(session级别) 我们来看看hibernate提供的一级缓存 //此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中.当再次查询学生信息时,会首先去缓存中看 ...

  9. hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)

    本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信 ...

随机推荐

  1. Android-自动完成提示框CompletionTextView

    自动完成提示框CompletionTextView可以实现以下效果(提示框从那里出来是系统自动处理的): 类似于在百度输入框,输入一个字符,会自动提示很多和这个相关的条目内容 定义自动完成提示框(此控 ...

  2. bitnami openedx安装的各种坑及痛苦经历

    那天在华为网站上学习,看见他们的培训系统挺不错的,看到下边写着openedx,百度了一下是个开源软件,挺流行的,在这之前对于openedx没有任何了解,然后开始了一周多的痛苦经历. 首先在opened ...

  3. 使用SqlBulkCopy进行批量插入数据时踩过的坑

    之前一直都没用过SqlBulkCopy关键字进行数据插入,更没了解过. 事因:因业务需要在数据表中添加两列,然后将数据插入进表中 之前都是这样写的 dt.Columns.Add(new DataCol ...

  4. docker 命令大全

    http://www.runoob.com/docker/docker-command-manual.html

  5. 解决Win8.1系统Wpprecorder.sys蓝屏故障

    为了跨平台调试,在Mac Air使用Bootscamp安装了Windows 8.1,但是经常出现system_thread_exceptions_not_handled(Wpprecorder.sys ...

  6. RHEL因为selinux设置失误,无法重启问题。(centos适用)

    今天做FTP模拟的时候selinux设置出现失误.导致系统无法重新启动.出现如下界面 Failed To Load SELinux policy.freezing .. 网上找了下,解决方法如下: 开 ...

  7. system idle process

    偶然发现windows环境任务管理其中存在进程 system idle process,cpu占用极大但内存占用很小.google了一下,保存下结果 system idle process :系统空闲 ...

  8. alicemq 方便的RabbitMQ 可视化工具

    尽管RabbitMQ 自带一个管理插件,但是还不是那么强大,alicemq 是一个方便强大的可视化工具 rabbitmq 环境准备 docker-compose 文件 version: "3 ...

  9. “全栈2019”Java第三十八章:类与方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 初学C#,用vs去开始hello world!

    小弟初学c#,刚刚学会用vs来编写经典的hello,world程序,记录,并且分享给大家. 1. 用vs新建一个c#控制台程序: a. 首先打开vs,如下图所示,点击[新建项目]