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

本文深入探讨Hibernate框架的高级特性,包括懒加载策略、HQL查询语法、锁机制及缓存管理等内容,帮助开发者掌握更高效的数据库交互技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        之前几篇博客简单介绍了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-onlyread-write。





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值