在 Hibernate(JPA)中,FetchType.LAZY
和 FetchType.EAGER
是用来控制实体类中关联属性(如 @OneToMany
, @ManyToOne
, @OneToOne
, @ManyToMany
)加载策略的两种方式,它们的主要区别在于何时加载关联对象的数据。
一、FetchType.LAZY
(懒加载)
- 含义:关联对象在真正被访问时才从数据库加载。
- 优点:性能更好,避免一次性加载太多数据,尤其在关系复杂时可以提高系统响应速度。
- 缺点:如果在 session 关闭之后再访问懒加载字段,会抛出
LazyInitializationException
。
示例:
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
orders
不会随着主对象加载,而是在你调用getOrders()
时,才会去查询数据库。
二、FetchType.EAGER
(急加载)
- 含义:关联对象在加载主实体时就会一并从数据库加载。
- 优点:方便使用,避免懒加载异常。
- 缺点:容易导致性能问题,因为即使你不需要用到关联对象,它也会被加载。
示例:
@ManyToOne(fetch = FetchType.EAGER)
private Customer customer;
加载订单时会立即连同其关联的
customer
一起加载。
三、何时使用?
- 默认值:
@ManyToOne
和@OneToOne
:默认是EAGER
@OneToMany
和@ManyToMany
:默认是LAZY
- 建议:
- 对于大多数场景,优先使用
LAZY
,只有在你非常确定需要一起加载数据时再用EAGER
。 - 使用
EAGER
可能会导致 N+1 查询问题或性能瓶颈。
- 对于大多数场景,优先使用