使用Spring / JPA / Rest的项目。 我们有一个具有@OneToMany字段的类(比如下面的例子中的Student),它标记为LAZY加载。但是,当我们在邮递员中测试输出时,我们会看到课程的完整json和所有学生的详细信息。
public class CourseList{
private String Course;
//other fields
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private <Set>Student students;
//Getters and Setters
}
我对延迟加载的理解是,数据库的提取仅在显式调用特定字段时发生。我们应该只看到json中的课程详细信息,而不是地址详细信息。为什么我们也看到地址详细信息?
如果我对LazyLoading的理解不正确或者出于某种原因它是否适用于此案例,有人可以帮助澄清一下吗?感谢。
答案 0 :(得分:3)
您的JSON库将递归读取对象的所有属性以生成输出。所以它正在访问学生集。
根据我的经验,你有三种可能的结果:
JSON序列化发生在JPA会话之外,因此对象是分离的。由于学生设置是懒惰的,你将获得例外。
JSON序列化发生在JPA会话中,因此当JSON库访问学生集时,数据将从数据库中获取。
JSON序列化发生在JPA会话之外,但是您以某种方式访问了之前和JPA会话中的学生集。数据已获取并可在分离的对象上使用。
我遇到了这个问题,我强迫第三种选择。我的第一次尝试给了我异常(选项1)但后来我强制从延迟加载的集中读取只是为了获取JSON序列化的数据。
答案 1 :(得分:1)
Spring Boot注册了一个OpenEntityManagerInViewInterceptor。 Spring引导默认配置spring.jpa.open-in-view = true
。
如果要禁用该行为,请添加配置spring.jpa.open-in-view = false
。
注册OpenEntityManagerInViewInterceptor。绑定JPA EntityManager 到整个请求处理的线程。
答案 2 :(得分:0)
// ^_^?
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Link Student student;
您想要返回包含CourseList
的{{1}},您需要创建List<Student>
或Response
实体,您必须确保Student
到{{} 1}},否则会发生StackOverflow错误。
本教程还提到了这个问题:Spring Data : JPA (Hibernate) One To Many Relationships and N+1 Query Problem