zoukankan      html  css  js  c++  java
  • 实体类的状态与Hibernate缓存

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

      1、瞬时态

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

          实例:

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

      2、持久态

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

          实例:

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

      3、托管态

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

           实例:

          

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

    二、Hibernate的缓存

        1、什么是缓存

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

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

        2、Hibernate缓存分类

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

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

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

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

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

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

                  代码:

        @Test
        public void Test6(){
            SessionFactory sessionFactory = HibernateUtils.getFactory();
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            UserEntity  userEntity1 = session.get(UserEntity.class, 2);
            System.out.println(userEntity1);
            UserEntity  userEntity2 = session.get(UserEntity.class, 2);
            System.out.println(userEntity2);
            tx.commit();
            session.close();
            sessionFactory.close();
        }

                  验证结果:

                                                         

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

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

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

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

              

      

               (4)一级缓存的特性

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

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

                验证代码:

                   

    @Test
        public void Test7(){
            SessionFactory sessionFactory = HibernateUtils.getFactory();
            Session session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            UserEntity  userEntity1 = session.get(UserEntity.class, 2);
            userEntity1.setPwd("asddfff");
            tx.commit();
            session.close();
            sessionFactory.close();
        }

                验证结果:

                

                该特性的原理与过程:

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

                  库的数据。

                                      

          (5)Hibernate的二级缓存

          • 默认关闭,需要通过配置文件配置才能开启。
          • 目前已经放弃使用,使用redis技术替代。
          • 使用的范围是sessionfactory的范围。                
  • 相关阅读:
    React 组件的生命周期方法
    Ant Design 错误记录与常用例子
    roadhog中如何拷贝文件
    API加密框架monkey-api-encrypt发布1.2版本
    必杀技:当报错信息看不出原因时,怎么办?
    当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
    Kitty-Cloud服务搭建过程剖析
    Maven快照版本要这样用才真的香!
    Kitty-Cloud环境准备
    双剑合璧的开源项目Kitty-Cloud
  • 原文地址:https://www.cnblogs.com/jack1995/p/6937573.html
Copyright © 2011-2022 走看看