Hibernate(JPA)中,FetchType.LAZYFetchType.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 查询问题或性能瓶颈。