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特性