小编典典

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

all

我是 Java Persistence API 和 Hibernate 的新手。

Java Persistence
APIFetchType.LAZY和in之间有什么区别?FetchType.EAGER


阅读 222

收藏
2022-03-04

共1个答案

小编典典

有时您有两个实体,并且它们之间存在关系。例如,您可能有一个名为的实体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.
}
2022-03-04