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

查询缓存

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

   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

猜你喜欢

转载自blog.csdn.net/a5421901/article/details/88364071