我有以下疑问。我想知道为什么在使用 JPA 和 Hibernate 时,在ManyToOne或OneToMany关系中执行预加载时,它会调用数据库以获取实体信息,但另外还会生成后续查询来获取每个子项。
另一方面,当使用带有 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)