一、延迟加载核心概念

1.1 基本定义

延迟加载(Lazy Loading)是Hibernate的一种性能优化策略,它推迟对象关联数据的加载时机,只有在真正访问这些关联数据时才会从数据库加载。这种机制有效减少了不必要的数据库查询,显著提升了应用性能。

1.2 工作原理图示

[业务代码] → 访问主对象 → [Hibernate] → 返回主对象代理

访问关联属性

[Hibernate] → 触发SQL查询 → [数据库] → 加载真实数据

二、延迟加载的实现方式

2.1 代理模式实现

Hibernate通过动态生成实体类的子类代理来实现延迟加载:

@Entity

public class Order {

@Id

private Long id;

@ManyToOne(fetch = FetchType.LAZY)

private Customer customer; // 实际是Customer$HibernateProxy实例

}

代理对象特性:

初始只包含主键值

首次访问非id属性时触发加载

继承自原始实体类

2.2 字节码增强

通过字节码增强技术修改实体类:

@Entity

public class Product {

@OneToMany(mappedBy = "product")

private List reviews = new ArrayList<>(); // 实际是PersistentList实现

}

集合包装为特殊实现类

拦截集合访问操作

按需加载数据

三、配置延迟加载

3.1 注解配置方式

// 单个关联的延迟加载

@ManyToOne(fetch = FetchType.LAZY)

private Department department;

// 集合关联的延迟加载(默认就是LAZY)

@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY)

private Set tasks = new HashSet<>();

// 基本属性的延迟加载(需要字节码增强)

@Basic(fetch = FetchType.LAZY)

@Lob

private String resumeText;

3.2 XML映射配置