在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();
延迟加载的优点:
- 较好的性能,可以减少SQL查询的数量。
- 避免加载无用的数据,根据需要选择加载。
急加载的优点:
- 简单方便,直接获取关联数据。
- 避免延迟加载过程中的懒加载异常。
需要根据具体场景选择延迟加载或急加载,以取得最佳的性能与易用性。