在 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 查询问题或性能瓶颈。
- 对于大多数场景,优先使用






苏公网安备32021302001419号