hibernate检索策略

本文详细介绍了Hibernate中的三种检索策略:立即检索、延迟加载和迫切左外连接,探讨了它们的工作原理、优缺点以及类级别和关联级别的懒加载选项,包括batch-size和max_fetch_depth配置对性能的影响。
摘要由CSDN通过智能技术生成

hibernate检索策略

hibernate一共提供了三种检索策略,一种为立即检索,除了立即检索之外还提供了两种检索策略,延迟检索迫切左外连接检索

  • 立即检索 会直接进行数据库访问,且立即执行,如果select语句过多,会频繁访问数据库
  • 延迟检索 避免了多余加载用程序不需要访问的关联对象
  • 迫切左外连接检索 充分利用了SQL的外连接查询功能,减少了select语句的数目

类级别的检索策略

类级别的可选检索策略只有立即检索延迟检索

在元素中设置属性lazy 默认为true

  • 立即检索:立即加载检索方法指定的对象
  • 延迟检索:在调用load方法时不会执行select语句,而是返回一个代理对象,这个代理对象继承了原来对象的所有属性和方法(使用CGLIB生成的代理类),该代理类的实例仅初始化OID,所以占用的内存较少,只有在使用具体属性(除id之外的属性)的时候才会去执行select语句。代理对应的geeter方法

只有在使用load方法的时候,lazy属性才会有用,在使用get()和list()方法时,只会使用立即检索

关联级别的检索策略

关联级别可选的检索策略有三种:立即检索延迟检索迫切左外连接检索

一对多和多对多检索策略

在set属性中配置一对多和多对多关联关系,元素有lazy和fetch属性

  • lazy:主要决定被初始化的时间,在加载主表时被初始化还是在访问该集合时被初始化 默认为true,有true(延迟检索)、extra(增强延迟检索)和false(立即检索)
    • true 在调用iterator()、size()、isEmpty()、contains方法时会进行初始化
    • extra 在调用iterator()方法时会进行初始化,而调用size()、isEmpty()、contains方法时,不会进行初始化,而是通过特定的select语句来查询必要的信息,而不是检索所有的对象
  • fetch:取值为select或subselect时,决定初始化的查询语句形式;取值为join,决定被初始化的时机,lazy属性将会被忽略,默认为select
    • select 元素中每条数据都会执行一条select语句
    • subselect 使用子查询,直接初始化set中所有的元素,使用 in (select id from zitable),此时batch-size属性被忽略
    • join 使用左外连接 (Query的list方法会忽略join,使用延迟检索)
  • batch-size:中有一个batch-size属性,用来配置在延迟加载的情况下,每次加载几条数据,可以减少查询语句,提升性能(查询多条时使用in语句查询),仅适用于立即检索和延迟检索

对于元素Hibernate是使用的代理类org.hibernate.collection.internal.PersistentSet

多对一和一对一检索策略

在元素和中也包含lazy属性和fetch属性

  • lazy: proxy表示延时检索 no-proxy表示无代理延迟检索 false 表示立即检索 默认proxy
  • fetch:select表示每条数据使用一个select join表示使用左外连接 默认select
  • batch-size:可以在一的一端的元素中设置batch-size,来配置一次初始化1的这一端的代理的个数,仅适用于立即检索和延迟检索

影响的方法有load方法、get方法以及Query和Criteria的API

在进行迫切左外连接时,由于过深的进行表连接会影响检索性能,所以hibernate设置了一个进行控制外连接深度的配置

hibernate.max_fetch_depth,该配置默认是2

https://zhhll.icu/2020/框架/hibernate/基础/9.hibernate检索策略/

本文由mdnice多平台发布

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾光师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值