小编Dav*_*tel的帖子

JPA 和 Hibernate:急切加载执行后续查询以获取所有数据,而不是仅在一个查询中执行此操作

我有以下疑问。我想知道为什么在使用 JPA 和 Hibernate 时,在ManyToOneOneToMany关系中执行预加载时,它会调用数据库以获取实体信息,但另外还会生成后续查询来获取每个子项。

另一方面,当使用带有 JOIN FETCH 的查询时,它会按照我的预期执行查询,一次获取所有信息,因为 fetchType 表示为“EAGER”。

这是一个简单的例子:

我有一个班级学生,它与班级教室有多对一的关系。

@Entity
@Table(name = "STUDENT")
public class Student {

@ManyToOne(optional = true, fetch = FetchType.EAGER)
        @JoinColumn(name = "ClassroomID")
        private Classroom mainClass;
Run Code Online (Sandbox Code Playgroud)

另一边有一个名为 Classroom 的类,如下:

@Entity
public class Classroom {

@OneToMany(cascade = CascadeType.ALL, mappedBy = "mainClass", fetch = FetchType.EAGER)
private List<Student> studentsList;
Run Code Online (Sandbox Code Playgroud)

在获取Classroom对象时,它会执行一次查询从自身获取信息,并执行后续查询以获取每个classRoom对象的studentsList中包含的每个学生的信息。

第一个查询:

Hibernate: 
/* SELECT
         r 
     FROM
         Classroom r 
     LEFT JOIN
         r.classStudents */ 

     select
         classroom0_.id as id1_0_,
         classroom0_.number as number2_0_ 
     from …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa eager-loading

7
推荐指数
1
解决办法
7028
查看次数

标签 统计

eager-loading ×1

hibernate ×1

java ×1

jpa ×1