08.Hibernate的一级缓存-->>Session

Hibernate提供了两种缓存:

  • 1.一级缓存:自带的不可卸载的,一级缓存的生命周期与Session一致,一级缓存成为Session级别的缓存
  • 2.二级缓存:默认没有开启,需要手动配置才可以使用,二级缓存可以在多个Session中共享数据,二级缓存成为SessionFactory级别的缓存

Sesison对象的缓存概述:  

  • 1.将对象存入到一级缓存中,session生命周期没有结束,那么对象在session中存放着
  • 2.内存中包含session的实例--->>>session的缓存(一些集合)--->>>集合包含的是缓存对象!

证明一级缓存的存在:

  在同一个Session中两次查询,查看执行了哪些SQL语句

    @Test
    public void m01(){
        Session session = HibernateUtils.openSession();
        Transaction tr = session.beginTransaction();
        
        User user1 = session.get(User.class, 1L);
        System.out.println("-------------------------------");
        User user2 = session.get(User.class, 1L);
        
        tr.commit();
        session.close();
        
    }

  控制台显示:

  只执行了一次查询语句,说明第一次查询之后 Hibernate将持久化对象存储在session中,再次执行就不用去数据库查询

Hibernate如何做到数据库与session进行同步更新操作

  使用get()查询到一个User对象,然后设置user的一个属性,commit。

  发现数据库中的该user属性也变化了(没有做update操作)

  快照机制

    @Test
    public void m02(){
        Session session = HibernateUtils.openSession();
        Transaction tr = session.beginTransaction();
        
        User user = session.get(User.class, 3L);
        user.setAge(1);
        
        tr.commit();
        session.close();
        
    }

数据库变化:

===>>>

  证明了快照的存在

session的一些方法

  • session.clear();  --清空缓存
  • session.evict(obj);  --从缓存中清除指定对象
  • session.flush();  --刷出缓存(在不commit得情况下和数据库同步)
原文地址:https://www.cnblogs.com/NEWHOM/p/6763353.html