查询缓存
为数据缓存,不需要缓存一张表中的所有的字段,只需要一部分字段
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