hibernate 缓存 笔记

hibernate一级缓存

一级缓存生命周期很短,它session的生命周期一致,一级缓存也叫session级的缓存,也称事务级缓存

哪些方法支持一级缓存?
 *load
 *get
 *iterate查询实体对象支持一级缓存

一级缓存是缓存实体对象的

一级缓存如何管理?
 * session.clear(),session.evict()
 
如何避免一次性打批量的实体数据插入后内存溢出
 * 先flush,再clear
  
如果在现实工作中,遇到了大规模的数据,建议使用jdbc导入或数据库特定工具导入

 

hibernate二级缓存

二级缓存也称进程级缓存或SessionFactory级缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存

二级缓存的配置和使用:
 * 将ehcache.xml配置文件拷贝到src下
 * 启用二级缓存,默认是启用的
 <property name="hibernate.cache.use_second_level_cache">true</property>
 * 指定缓存产品提供商,如:
  <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
 * 指定哪些实体类使用二级缓存(两种方法)
  * 在映射文件中指定
  * 在hibernate.cfg.xml文件中指定
  
二级缓存是缓存实体对象的

 

 

hibernate查询缓存

查询缓存是缓存普通属性结果集的
对实体对象的结果集只缓存id

查询缓存的生命周期,当关联的表发生修改,那么查询缓存的生命周期结束

查询缓存的配置和使用:
 * 在配置文件hibernate.cfg.xml中启用查询缓存,如:
 <property name="hibernate.cache.use_query_cache">true</property>
 * 在程序中必须手动启用查询缓存,如:
 query.setCachable(true)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

component映射

在hibernate中,component是实体对象的逻辑组成部分,它与实体对象的根本区别在于没有oid

采用component映射的好处:实现了对象模型的细粒度划分,层次分明,利于复用

 

 

复合主键映射(联合主键)

通常将复合主键相关的属性放到一个单独的类中,这个是有约束的:
 * 必须实现序列化接口
 * 必须复写hashCode和equals方法
 

 lazy策略可以应用在:
 * <class>标签上,可以取值true/false
 * <property>标签上,可以取值true/false,需要类增强工具
 * <set><list>集合标签上,可以取值true/false/extra
 * <one-to-one>、<many-to-one>单端关联上,可以取值false/proxy/noproxy
 
lazy的概念:在正真使用的时候发出查询语句加载相应的对象

hibernate支持lazy策略只有在session打开状态下才有效

hibernate类级别的lazy只对普通属性起作用,可以控制什么时候加载这些普通属性 

 

hibernate在集合上的lazy策略:可以取值true/false/extra

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其
     集合元素的数据
false:取消lazy特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的lazy策略,即调用集合的size等方法的时候,hibernate 并不会去
      加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需
      要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据

<class>标签上配置的lazy不会影响到集合上的lazy特性

 

 

hibernate在单端关联上的lazy策略可以取值:false/proxy/noproxy

false:取消lazy策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认lazy策略,即只有在调用到其关联对象的方法的时候
      才真正发出查询语句查询其对象数据,其关联对象是代理类
no-proxy:这种lazy特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

<class>标签上配置的lazy不会影响到单端关联对象上的lazy特性

你可能感兴趣的:(sql,Hibernate,xml,cache,配置管理)