Hibernate学习笔记-查询缓存、lazy、fetch、hql

本文探讨了数据缓存机制,特别是查询缓存及其在时间变化中的应用,以及懒加载如何提升效率。深入分析了Hibernate中缓存的使用,包括二级缓存准备和查询缓存的开启。此外,详细讲解了类和集合的懒加载配置,以及fetch策略对SQL语句的影响。

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

查询缓存

     为数据缓存,不需要缓存一张表中的所有的字段,只需要一部分字段

   UpdateTimeStampsCache记录了查询缓存中数据随着时间的变化,hibernate内部就是通过时间戳的方式来检查查询缓存中的数据是否发生变化

步骤

        步骤1

                 二级缓存的准备工作

    步骤2

        开启查询查询缓存

     

客户端

 

 

lazy

        需要的时候,加载,不需要的时候,不加载。

类的懒加载

     从上图可以看出session.load方法是懒加载

  类的延迟加载在映射文件中可以配置

       

集合的懒加载

默认情况

 

 1、默认的就是延迟加载

 2、当遍历集合的时候,向数据库要数据,并且输出

 

 

 

lazy为false

lazy为extra

 

 

manytoone的懒加载

     可以保持默认值

总结

        延迟加载是通过控制SQL语句的发出的时间来提高效率的。

fetch

        研究发出怎么样的sql语句,加载集合

默认值select

   这样的情况会导致n+1条sql,n为classes表中的记录数

subselect

 

代码同上

 

场景:当把需求分析翻译过来以后,含有子查询,这个时候,用这种策略效率比较高

join

   如果根据需求分析,翻译成sql 语句含有子查询,这个时候用join无效

  

   该需求是不含子查询

 

     是左外连接的sql 语句

lazy与fetch

   如果fetch为"join",lazy不论设置成什么样的值,都不起作用

   如果fetch为"select",先加载classes,再加载student,而lazy决定在什么时候加载student

hql

    hibernate query language

   

单表

例1

例2

   投影查询

例3

 

例4

例5

例6

 

例7

例8

例9

一对多

等值连接

内连接

左外连接

迫切内连接

迫切左外连接

两个字段分别来自不同的表

  join后面不能接fetch

多对多

 

一对多结合多对多

多对多结合多对多

 

作业

Consult:咨询员类

   Set<Role> roles;

   Set<Student> students;

Student:学生类

   Set<Consult> consults;

Role:角色类

   Set<Consult> consults;

   Set<Student> students;

   Set<Privilege> privileges;

Privilege:权限类

   Set<Role> roles;

由咨询员查询权限:

   from Consult c inner join fetch c.roles r inner join fetch r.privilegs p

由学生查询权限

   from Student s inner join fetch s.roles r inner join fetch r.privileges p

由咨询员查询学生的权限

   from Privilege p inner join fetch p.roles r inner join fetch r.student s inner join fetch

            s.consults c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值