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

2022-08-31 04:09:26

我是Java Persistence API和Hibernate的新手。

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


答案 1

有时你有两个实体,它们之间有关系。例如,您可能有一个名为的实体和另一个称为“大学”的实体,并且“大学”可能有许多“学生”:UniversityStudent

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

A university has many students

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

   // setters and getters
}

现在,当您从数据库加载大学时,JPA 会为您加载其 ID、名称和地址字段。但是,对于应如何加载学生,您有两种选择:

  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.
}

答案 2

基本上

LAZY = fetch when needed
EAGER = fetch immediately

推荐