Java Persistence API 中 FetchType LAZY 和 EAGER 的区别?

新手上路,请多包涵

我是 Java Persistence API 和 Hibernate 的新手。

Java Persistence API 中的 FetchType.LAZYFetchType.EAGER 有什么区别?

原文由 leon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 827
2 个回答

有时您有两个实体,并且它们之间存在关系。例如,您可能有一个名为 University 的实体和另一个名为 Student 的实体,一个大学可能有很多学生:

University 实体可能具有一些基本属性,例如 id、name、address 等,以及一个名为 students 的集合属性,该属性返回给定大学的学生列表:

一所大学有很多学生

 public class University {
   private String id;
   private String name;
   private String address;
   private List<Student> students;

   // setters and getters
}

现在,当您从数据库中加载大学时,JPA 会为您加载其 id、name 和 address 字段。但是对于如何加载学生,您有两种选择:

  1. 将其与其余字段一起加载(即急切地),或
  2. 当您调用大学的 getStudents() 方法时按需(即懒惰地)加载它。

当一所大学有很多学生时,将所有学生一起加载是没有效率的,特别是当他们不需要时,在这种情况下,您可以声明您希望学生在实际需要时加载。这称为延迟加载。

这是一个示例,其中 students 被明确标记为急切加载:

 @Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.EAGER)
    private List<Student> students;

    // etc.
}

这是一个示例,其中 students 被明确标记为延迟加载:

 @Entity
public class University {

    @Id
    private String id;

    private String name;

    private String address;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Student> students;

    // etc.
}

原文由 Behrang 发布,翻译遵循 CC BY-SA 4.0 许可协议

基本上,

 LAZY = fetch when needed
EAGER = fetch immediately

原文由 unbeli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题