get,load,list,iterator查询数据.

把session级别的缓存成为一级缓存,sesssionfactory级别的缓存成为二级缓存。
二级缓存默认是关闭状态 .

get方法首先会去查询一级缓存,如果一级缓存中有数据,则不再发sql语句。如果一级缓存中没有查询到数据,则再去二级缓存中查询数据(二级缓存打开的情况),如果找不到,则
发sql语句到数据库区查询。

load方法首先会去查询一级缓存,如果一级缓存中有数据,则不再发sql语句。如果一级缓存中没有查询到数据,则再去二级缓存中查询数据(二级缓存打开的情况),如果找不到,则
发sql语句到数据库区查询。

list方法不会利用一级缓存和二级缓存。利用查询缓存.
iterate方法在任何情况下首先会发一条查询所有对象主键的sql,然后根据每个主键去一级缓存和二级缓存中寻找数据,如果有此数据,则不再发sql语句,没有则再发sql语句查询每一个对象的详细信息。
此种情况我们称为N+1问题。
iterate方法会利用一级缓存和二级缓存,但不会利用查询缓存。


二级缓存配置的步骤:
1. 拷贝jar包:hibernate-release-4.2.4.Final\lib\optional\ehcache\*.jarn
2. 拷贝二级缓存的配置文件hibernate-release-4.2.4.Final\project\etc\ehcache.xml到src下.
<defaultCache
<!-- 内存中可以缓存的最多对象的数量 -->
maxElementsInMemory="10000"
<!-- 是表示对象是否永远不失效,如果设为true,则以下两个属性失效 -->
eternal="false"
<!-- 对象在二级缓存中发呆的时间是120,如果120秒还没有人来访问此对象,那么此对象自动失效 -->
timeToIdleSeconds="120"
<!-- 表示对象存活的时间为120,如果用户使用此对象超过120秒,则自动解除关联,失效。 -->
timeToLiveSeconds="120"
<!-- 表示如果二级缓存存储满了,则是否向硬盘上存储,true表示多余的对象存放到硬盘上 -->
overflowToDisk="true"
/>

3.配置全局配置文件,开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 配置二级缓存的策略提供商 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

4.需要在想放到二级缓存中的对象的映射文件中配置: <Cache usage="read-only"> 标签 配置在<Id>标签前面


查询缓存: get,load 方法查出来的都是对象。如果我们希望查出来的部分属性想要缓存,那么这个缓存就是查询缓存.
查询缓存缓存的都是属性。 也可以缓存对象。
get,load是不会利用查询缓存的。

利用查询缓存的步骤:
1. 在全局配置文件中开启查询缓存 :
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>

2. 需要在查询的时候利用query.setCacheable(true) ;来指定结果集要放到查询缓存中