hibernate进阶之路之其他知识(六)
2016-06-29 11:12
120 查看
之前几篇博客简单介绍了hibernate基本知识,和几种常见的映射,还有一些不常用的映射例如:继承映射、复合主键映射等就不介绍了。本篇博客讲介绍hibernate其他的一些常用知识。
一、lazy策略
lazy懒加载可以提高效率,在真正使用的时候再去创建,再发出sql语句加载该对象,提升了性能。
lazy有以下策略:
1、lazy可以在映射文件的<class>标签上,取值为true/false;
2、lazy可以在映射文件的<property>标签上,取值为true/false;
3、lazy可以在映射文件的<set>标签上,取值为true/false/extra;
4、lazy可以在映射文件的<many-to-one>/<one-to-one>单端关联的标签上,取值为false/proxy/noproxy;
lazy只有session.load()方法支持,get不支持。在load方法执行的时候不会发出sql语句,在查询的实体真正用的时候才会,
例如user.getName()会发出sql语句,然后结果会放在缓存中,之后就可以不发出sql语句了。
注意,lazy只有在session开启的时候才可以使用,关闭了会报 LazyInitializationException:19 - could not initialize proxy
- the owning Session was closed的错误。
二、hql语句
hql是面向对象的方式生成sql,用类和属性代替表和字段,支持多态,支持关联查询;支持关系型数据库的操作,
连接:join、投影:projection;聚合:avg、max;分组:group;排序:ordering;子查询:subqueries;等。
可以查询到指定属性:
条件查询:
强类型查询:
导航查询:
关联查询:
分页查询:
三、锁
悲观锁:LockMode只是在使用Hibernate 中 的session.load()加载数据时指定的模式,也叫悲观锁(模式),
然而,悲观锁是为了弥补read-committed 机制的不足,从而解决non-repeatable (不可重复读)和 phantom-read (幻读)问题。
锁定模式:
使用方法:
session.load(Student.class,1001,LockMode.UPGRADE);
四、缓存
1、一级缓存
缓存是缓存的实体对象,一级缓存生命周期和session的生命周期一致,一级缓存默认开启,也叫session级别缓存或者事务级缓存。
load/get/iterate查询实体对象都支持一级缓存,如果是大批量的数据更新操作,要每个20或者30次更新执行一遍session.flush();session.close();清除缓存。
2、二级缓存
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
二级缓存的配置和使用,采用第三方缓存框架ehcache:
*
将ehcache.xml文件拷贝到src下
*
在hibernate.cfg.xml文件中加入缓存产品提供商
<!-- 配置缓存提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 启用二级缓存,这也是它的默认配置 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<mapping resource="com/tgb/hibernate/Student.hbm.xml"/>
<mapping resource="com/tgb/hibernate/Classes.hbm.xml"/>
<!--
指定Student使用二级缓存,也可以在student的映射文件中<cache/>配置
-->
<class-cache class="com.tgb.hibernate.Student" usage="read-only"/>注意使用的策略,通常采用read-only和read-write。
一、lazy策略
lazy懒加载可以提高效率,在真正使用的时候再去创建,再发出sql语句加载该对象,提升了性能。
lazy有以下策略:
1、lazy可以在映射文件的<class>标签上,取值为true/false;
2、lazy可以在映射文件的<property>标签上,取值为true/false;
3、lazy可以在映射文件的<set>标签上,取值为true/false/extra;
4、lazy可以在映射文件的<many-to-one>/<one-to-one>单端关联的标签上,取值为false/proxy/noproxy;
lazy只有session.load()方法支持,get不支持。在load方法执行的时候不会发出sql语句,在查询的实体真正用的时候才会,
例如user.getName()会发出sql语句,然后结果会放在缓存中,之后就可以不发出sql语句了。
注意,lazy只有在session开启的时候才可以使用,关闭了会报 LazyInitializationException:19 - could not initialize proxy
- the owning Session was closed的错误。
二、hql语句
hql是面向对象的方式生成sql,用类和属性代替表和字段,支持多态,支持关联查询;支持关系型数据库的操作,
连接:join、投影:projection;聚合:avg、max;分组:group;排序:ordering;子查询:subqueries;等。
可以查询到指定属性:
List students=session.createQuery("select id,name from Student").list();
条件查询:
//可以拼串 List students = session.createQuery("select s.id, s.name from Student s where s.name like '%0%'").list();
强类型查询:
//可以使用hql返回Student对象 //需要提供构造函数 List students = session.createQuery("select new Student(id, name) from Student").list();
导航查询:
List students = session.createQuery("from Student s where s.classes.name like '%2%'").list();
关联查询:
List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
分页查询:
List students = session.createQuery("from Student").setFirstResult(1).setMaxResults(2).list();
三、锁
悲观锁:LockMode只是在使用Hibernate 中 的session.load()加载数据时指定的模式,也叫悲观锁(模式),
然而,悲观锁是为了弥补read-committed 机制的不足,从而解决non-repeatable (不可重复读)和 phantom-read (幻读)问题。
锁定模式:
使用方法:
session.load(Student.class,1001,LockMode.UPGRADE);
四、缓存
1、一级缓存
缓存是缓存的实体对象,一级缓存生命周期和session的生命周期一致,一级缓存默认开启,也叫session级别缓存或者事务级缓存。
load/get/iterate查询实体对象都支持一级缓存,如果是大批量的数据更新操作,要每个20或者30次更新执行一遍session.flush();session.close();清除缓存。
2、二级缓存
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
二级缓存的配置和使用,采用第三方缓存框架ehcache:
*
将ehcache.xml文件拷贝到src下
*
在hibernate.cfg.xml文件中加入缓存产品提供商
<!-- 配置缓存提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 启用二级缓存,这也是它的默认配置 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<mapping resource="com/tgb/hibernate/Student.hbm.xml"/>
<mapping resource="com/tgb/hibernate/Classes.hbm.xml"/>
<!--
指定Student使用二级缓存,也可以在student的映射文件中<cache/>配置
-->
<class-cache class="com.tgb.hibernate.Student" usage="read-only"/>注意使用的策略,通常采用read-only和read-write。
相关文章推荐
- 进程和计划任务管理
- tableview属性 不显示cell分割线,右边小箭头取消选中 iOS 新手笔记
- Swift自定义进度圆
- 表单有中文后台乱码
- C++中智能指针的工作原理和简单实现
- robotframework 常用快捷键
- 跟我学Android之三 常用视图
- 跟我学Android之三 常用视图
- [改善Java代码]动态加载不适合数组
- CEdit控件[转]
- 转载:善待Redis中的数据
- python中精确输出JSON浮点数的方法
- maven项目导入eclipse
- NYOJ Gone Fishing 贪心策略
- sass的安装(mac OSX、window OS)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- dhcpd
- ios 网络请求问题
- Leetcode12. Integer to Roman
- java读取sql脚本文件并写入数据库