首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@LazyLoading和JsonOutput

@LazyLoading和JsonOutput
EN

Stack Overflow用户
提问于 2017-04-24 03:45:29
回答 3查看 1K关注 0票数 1

处理使用Spring/JPA/Rest的项目。我们有一个类,它有一个@OneToMany字段(例如下面的示例中的say),它被标记为延迟加载。然而,当我们用邮递员测试输出时,我们看到了课程的全部json和所有的学生细节。

代码语言:javascript
复制
public class CourseList{

private String Course;
//other fields

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)    
private <Set>Student students;

//Getters and Setters

}

我对延迟加载的理解是,只有在显式调用特定字段时,数据库的获取才会发生。我们应该只看到json中提到的课程细节,而不是地址details..why,我们也看到了地址细节吗?

如果我对LazyLoading的理解是不正确的,或者它是否由于某种原因而不适用于这种情况,那么有人能帮助澄清吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-24 05:52:23

您的JSON库将递归地读取对象的所有属性,以便生成输出。所以它访问的是学生的集合。

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

  1. JSON序列化发生在JPA会话之外,因此对象被分离。由于学生集是懒惰负载,您将得到一个例外。
  2. JSON序列化发生在JPA会话中,因此当JSON库访问学员集时,数据将从数据库中获取。
  3. JSON序列化发生在JPA会话之外,但您已经以某种方式访问了在此之前和JPA会话中设置的学生。数据是获取的,并且可以在分离的对象上使用。

我有过这样的问题,我强迫了第三种选择。我的第一次尝试给出了异常(选项1),但随后我强制从延迟加载的集合中读取数据,以获取JSON序列化的数据。

票数 3
EN

Stack Overflow用户

发布于 2017-04-24 12:09:45

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-24 05:36:47

代码语言:javascript
复制
// ^_^?
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)    
public Link Student student;

要返回CourseList (包括List<Student> ),需要创建ResponseStudent实体,您必须确保没有@ManyToOneCourseList,否则会发生StackOverflow错误。

本教程还提到了这个问题:Spring数据: JPA (Hibernate)一对多关系和N+1查询问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43579457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档