hibernate进阶之路之其他知识(六)

        之前几篇博客简单介绍了hibernate基本知识,和几种常见的映射,还有一些不常用的映射例如:继承映射、复合主键映射等就不介绍了。本篇博客讲介绍hibernate其他的一些常用知识。

一、lazy策略


        lazy懒加载可以提高效率,在真正使用的时候再去创建,再发出sql语句加载该对象,提升了性能。

        lazy有以下策略:

        1、lazy可以在映射文件的标签上,取值为true/false;

        2、lazy可以在映射文件的标签上,取值为true/false;

3、lazy可以在映射文件的标签上,取值为true/false/extra;

        4、lazy可以在映射文件的/单端关联的标签上,取值为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 (幻读)问题。
锁定模式:
hibernate进阶之路之其他知识(六)_第1张图片
使用方法:
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文件中加入缓存产品提供商


	org.hibernate.cache.EhCacheProvider
		
	
	true
		
	
	
		
	
	
注意使用的策略,通常采用 read-only read-write。





你可能感兴趣的:(java)