夜光带你走进Hibernate(四)
夜光序言:
孤独放生春风
窗外全是寂寞
拍拍肩头前尘
奔跑依旧继续。
正文:
1. hibernate对象状态
session.save(对象);
- 临时状态
1 . 直接new出来的对象
2. 不处于session的管理(即没有与任何一个session关联)
3. 对象在数据库中没有对应的记录
Employee e = new Employee();
e.setId(2); 只要主键在数据库中存在,就说这个对象在数据库中有对应记录
在数据库中叫主键~~么么
OID, object identified 对象的唯一标识 (对应数据库中的主键)
- 持久化状态
1. 处于session的管理范围
当执行session的方法如:save/update/saveOrUpdate/get/load
对象就会自动转变为持久化状态
2. 在数据库中有对应的记录
3. 处于持久化状态的对象,当对对象属性进行更改的时候,提交事务更改会反映到数据库中
- 游离状态
1. 对象不处于session的管理范围; 通常指session关闭后对象的状态
2. 对象在数据库中有对应的记录
2. Session缓存
概念:
Session缓存,也叫做一级缓存
当执行session的相关方法,如: save()/update()/get()/load()等方法的时候,对象会自动放入一级缓存中。
当Session关闭后,一级缓存内容失效
特点:
1)缓存有效范围,只在当前session范围内有效~~,帅气~缓存时间很短、作用范围小
2)一级缓存,可以在短时间内多次操作数据库的时候,才会明显提升效率
一级缓存的结构:Ma<主键,对象>
3)在提交事务时候,
Hibernate会同步缓存数据到数据库中,会对比缓存数据与数据库数据是否一致,如果不一致,才提交更改到数据库(生成update)
4) hibernate提供的一级缓存有hibernate自身维护,如果想操作一级缓存内容,必须通过hibernate提供的方法;
session.flush(); 手动让让一级缓存内容与数据库同步
session.evict(emp1); 清空一级缓存中对象: 清除指定的对象
session.clear(); 清空一级缓存中对象: 清除所有的对象
list()与iterator()查询区别
list: (通常使用频率较高)
Query接口定义的list查询方法,
一次查询所有满足需要的数据
iterator:
Query接口定义的iterator查询方法,
1. 先查询所有满足条件记录的主键 (查询1次)
2. 再根据每一个id,进行主键查询,有多少记录,查询多少次 (查询n次)
3. iterator查询: N + 1
4. iterator查询,迭代数据的时候,只有用到数据的时候,才会查找数据库(懒加载)
区别:
1. 查询数据方式不同: 查询全部与查询N+1
2. 一级缓存
List查询,查询的结果会放入一级缓存,但不会从一级缓存中获取
Iteraotro查询,会放入一级缓存,同时也会从一级缓存中获取