您的位置:首页 > 其它

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;等。
可以查询到指定属性:

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: