JPA中如何实现延迟加载?

在JPA中可以通过@OneToOne、@OneToMany和@ManyToOne注解的fetch属性配置延迟加载。

fetch属性有两个值:

  • FetchType.EAGER:急加载,默认值。主对象加载时就会加载关联对象。
  • FetchType.LAZY:延迟加载。主对象加载时不加载关联对象,需要时才加载。

示例:

@Entity
public class User {
    @Id
    private int id;
    private String name;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
}

@Entity
public class Order {
    @Id 
    private int id;
    @ManyToOne
    private User user;  
}

上例配置了User和Order的一对多关系,并指定FetchType.LAZY启用延迟加载。

加载User对象时,不会直接加载关联的orders集合,只有当调用orders集合的getter方法时,才会初始化集合并加载Order对象。

示例:

User user = em.find(User.class, 1);  // 直接加载User对象

// 访问orders集合,触发延迟加载   
List<Order> orders = user.getOrders();  

延迟加载的优点:

  1. 较好的性能,可以减少SQL查询的数量。
  2. 避免加载无用的数据,根据需要选择加载。

急加载的优点:

  1. 简单方便,直接获取关联数据。
  2. 避免延迟加载过程中的懒加载异常。
    需要根据具体场景选择延迟加载或急加载,以取得最佳的性能与易用性。