一尘不染

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

java

我是Java Persistence APIHibernate的新手。

FetchType.LAZYFetchType.EAGERJava Persistence API 之间有什么区别?


阅读 520

收藏
2020-03-01

共1个答案

一尘不染

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

University实体可能具有一些基本属性,例如id,名称,地址等,还有一个名为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.
}
2020-03-01