本博文主要讲解Hibernate的细节—->对象的状态和一级缓存…数据库
Hibernate中对象的状态:
- 临时/瞬时状态
- 持久化状态
- 游离状态缓存
学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础…固然啦,也就一点点知识markdown
当咱们直接new出来的对象就是临时/瞬时状态的..session
当保存在数据库中的对象就是持久化状态了学习
咱们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!测试
session.save(idCard); idCard.setIdCardName("我是测试持久化对象");
当Session关闭了之后,持久化的对象就变成了游离状态了…spa
Hibernate有一级缓存和二级缓存之分,这里主要讲解一级缓存hibernate
Hibenate中一级缓存,也叫作session的缓存,它能够在session范围内减小数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!设计
只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!code
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.clear(); 清空一级缓存中缓存的全部对象
clear
User user = null; user = (User) session.get(User.class, 1); //清除缓存,那么下面获取的时候,就不能从缓存里面拿了 session.clear(); user = (User) session.get(User.class, 1);
在有缓存的状况下,修改同一条记录的数据,以最后的为准…所以只有一条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可能就崩了…
值得注意的是:不一样的Session是不会共享缓存的!
咱们使用HQL查询所有数据的时候,可使用list()获得全部的数据,也可使用iterator()获得一个迭代器,再遍历迭代器…那它们有什么区别呢?
。。。。当时看视频的时候说是下图:
可是我在测试的时候:List也能够获取缓存的数据
固然啦,Iterator也是能够获取缓存的数据
所以,在获取数据的时候仍是使用list()方便!