2017-04-24 25 views
0

在使用Spring/JPA/Rest的项目上工作。 我们有一个有@OneToMany字段的类(在下面的例子中说学生),它标记为LAZY加载。但是,当我们在邮递员测试输出时,我们会看到完整的课程json和所有学生的详细信息。@LazyLoading和JsonOutput

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

你使用Spring Data Jpa吗? – ozgur

+0

是的,Spring Data JPA。 – HopeKing

回答

2

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

你有三种可能的结果在这里,从我的经验:

  1. JSON序列发生在JPA会话之外,因此对象是分离。由于学生组是懒惰加载,你会得到一个例外。

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

  3. JSON序列化发生在JPA会话之外,但您在某种程度上访问了在JPA会话之前和之后设置的学生。数据被提取并在分离的对象上可用。

我有这个问题,我强迫第三个选项。我的第一次尝试给了我例外(选项1),但是我强制从延迟加载集读取只是为了获取JSON序列化的数据。

+0

在第2点中,你是否说JSON序列化也被强制用于LAZY对象?这是否违背了LAZY的目的,还是像Postman这样的工具正在进行这种强制加载? – HopeKing

+1

您的** JSON库**不知道任何关于延迟加载是答案基本上是说。在没有任何进一步的处理指示的情况下,它会尝试像任何其他字段一样序列化惰性字段:这会触发数据库加载,根据您的JPA提供程序和其他各种情况,可能会或可能不会成功。这就是为什么存在Jackson Hibernate模块来解决这些问题的原因:https://github.com/FasterXML/jackson-datatype-hibernate –

0
// ^_^? 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
public Link Student student; 

要返回CourseList包括List<Student>,你需要创建你一定要确保没有@ManyToOneCourseList,否则会发生错误的StackOverflow的ResponseStudent实体。

本教程还指问题:Spring Data : JPA (Hibernate) One To Many Relationships and N+1 Query Problem

+0

恐怕你误解了我的问题。我意识到无限循环问题(链接指的是)。我的问题是关于postman JSON输出为什么会在结果中显示延迟加载的学生对象的原因 – HopeKing

1

Spring Boot注册一个OpenEntityManagerInViewInterceptor。 Spring启动默认配置spring.jpa.open-in-view = true。 如果要禁用该行为,请添加配置spring.jpa.open-in-view = false

注册OpenEntityManagerInViewInterceptor。将JPA EntityManager 绑定到整个处理请求的线程。

+0

谢谢@jackk!这似乎是正确的答案。但是,为什么会发生这种情况的一些细节可以帮助我和稍后阅读此线程的其他人。我搜索了一下,发现了这个很好的资源,可以解释这个问题在休眠和jpa中,但在eclipselink中没有问题。 http://vard-lokkur.blogspot.in/2010/12/jpa-lazy-loading-and-view-rendering.html – HopeKing

相关问题