@LazyLoading和JsonOutput

时间:2017-04-24 03:45:30

标签: java json spring jpa jackson

使用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的理解不正确或者出于某种原因它是否适用于此案例,有人可以帮助澄清一下吗?感谢。

3 个答案:

答案 0 :(得分:3)

您的JSON库将递归读取对象的所有属性以生成输出。所以它正在访问学生集。

根据我的经验,你有三种可能的结果:

  1. JSON序列化发生在JPA会话之外,因此对象是分离的。由于学生设置是懒惰的,你将获得例外。

  2. JSON序列化发生在JPA会话中,因此当JSON库访问学生集时,数据将从数据库中获取。

  3. JSON序列化发生在JPA会话之外,但是您以某种方式访问​​了之前和JPA会话中的学生集。数据已获取并可在分离的对象上使用。

  4. 我遇到了这个问题,我强迫第三种选择。我的第一次尝试给了我异常(选项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