实体类的状态与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的范围。                
时间: 2025-01-09 08:17:57

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

02-Hibernate实体类的三种状态

一.Hibernate的实体类有三种状态 Transient:瞬时状态,不被hibernate session管理,而且实体数据在数据库不存在 Persistent:持久化状态,被session管理,此时的对象被放在session的缓存中,实体对象存在数据库中. Detached:离线状态,实体对象在数据库中有数据与之对应,但是不被session管理 注意:被session所管理的实体对象,当对象的属性发生改变,在提交事务的时候会自动更新改变后的属性到数据库中. 下图是hibernate试题对象

06Hibernate实体类生命周期

前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度,Hibernate把实体类分为4种状态:持久化状态.临时状态.游离状态和删除状态.本文将会介绍Hibernate这些机制的细节以及使用方法. 1.Hibernate的Session缓存 (1)Session缓存的作用 使用Session的缓存有三大作用: 减少访问数据库的频率,当Session的get()

hibernate缓存机制详细分析 复制代码

您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: [email protected] / [email protected] 如果需要转载,请注明出处,谢谢!! 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以

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

hibernate缓存机制详细分析 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: 1 /** 2 * 此时会发出一条sql,将30个学生全部查询出来

hibernate缓存机制详细分析

http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 复制代码 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 501395377@qq.com / [email protected] 如果需要转载,请注明出处,谢谢!! 复制代码 在本篇随

(转)hibernate缓存机制详细分析

在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: /** * 此时会发出一条sql,将30个学生全部查询出来 */ List<Student> ls =

两个实体类比较,记录前后的数据变化,精确到每列的值

不是通用的方法,只是提供一个思路. 实体类: /// <summary> /// 体例数据实体类 /// </summary> public class RulesLayout { /// <summary> /// 体例元数据行业代码 /// </summary> public string hydm { get; set; } /// <summary> /// 体例元数据行业名称 /// </summary> public st

持久化类(状态介绍)---- Hibernate框架学习

叙:之前介绍了持久化.持久化类的相关信息,关于持久化类只讲了相关编写规则等(文章地址:https://www.cnblogs.com/Email-qtl777777/p/9650239.html),关于其内部的更多的划分并没进行细讲,本章电虫就持久化类的三个状态以及三种状态的区分以及三种状态的区分进行学习.记录: 持久化类的三种状态 Hibernate是持久层框架,通过持久化的类完成ORM(Java对象和数据库表的映射关系)操作:hibernate为更好地管理持久化类的状态,特此将持久化类分成三

spring+hibernate实体类注解详解(非原创) + cascade属性取值

@Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(name="INFOM_TESTRESULT") public class TestResult extends IdEntity{} 1 @Entity(name="EntityName") 必须 name为可选,对应数据库中一的个表 2 @Table(name="