Hibernate关联对象加载策略
Hibernate的抓取策略,又称为加载策略,决定了在何种情况下以及如何从数据库中加载关联对象。
主要有以下几种抓取策略:
-
延迟加载(Lazy Loading / FetchType.LAZY)
- 默认情况下,关联对象在初始化时不被加载,仅当第一次尝试访问关联对象的属性时,Hibernate才会发起查询去加载关联数据。这种策略有助于减少不必要的数据库查询,提高性能。
@ManyToOne(fetch = FetchType.LAZY) private Department department;
-
立即加载(Eager Loading / FetchType.EAGER)
- 在查询主对象时,立即执行关联对象的查询,一次性将所需数据全部加载到内存中。如果关联数据量较大,可能会增加内存消耗和数据库压力。
@ManyToOne(fetch = FetchType.EAGER) private Department department;
-
链接抓取(JOIN Fetching)
- 在查询主对象时,使用SQL JOIN操作来同时获取关联对象,避免发出额外的SQL查询。在Hibernate中,可以通过HQL或注解查询指定JOIN抓取。
@Entity @Table(name = "users") public class User { // ... @ManyToOne(fetch = FetchType.LAZY) @Fetch(FetchMode.JOIN) private Role role; }
或者在HQL查询中:
from User u left join fetch u.role
-
查询抓取(Select Fetching)
- 默认的抓取策略,当访问懒加载的关联对象时,单独发出SELECT语句来获取关联数据。
-
子查询抓取(Subquery Fetching)
- 使用子查询来获取关联对象,适合于某些特定情况下的性能优化。
-
批量抓取(Batch Fetching)
- 用于优化关联对象的加载,当多次加载同一类型关联对象时,通过一次查询获取多个关联对象,减少SQL查询次数。在映射文件或注解中使用
@BatchSize
配置。
@Entity @Table(name = "users") public class User { // ... @OneToMany(mappedBy = "user") @BatchSize(size = 20) private List<Order> orders; }
- 用于优化关联对象的加载,当多次加载同一类型关联对象时,通过一次查询获取多个关联对象,减少SQL查询次数。在映射文件或注解中使用
7、get与load
- get:立即检索。get方法一执行,立即查询所有字段的数据。session.get(Users.class, 1);
- load:延迟检索。默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值将查询 。
- 如果是:lazy=true,表示延迟检索,如果设置false表示立即检索。session.load(Users.class, 1);
- load方法过程:一级缓存 ---> 二级缓存 ----> DB访问 ---> 填充一级缓存[、二级缓存] / 返回一个代理类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!