Java @懒散加载和JsonOutput
正在处理使用Spring/JPA/Rest的项目。 我们有一个类,它有一个@OneToMany字段(在下面的例子中是Student),标记为延迟加载。然而,当我们在postman中测试输出时,我们会看到课程的完整json以及所有学生的详细信息Java @懒散加载和JsonOutput,java,json,spring,jpa,jackson,Java,Json,Spring,Jpa,Jackson,正在处理使用Spring/JPA/Rest的项目。 我们有一个类,它有一个@OneToMany字段(在下面的例子中是Student),标记为延迟加载。然而,当我们在postman中测试输出时,我们会看到课程的完整json以及所有学生的详细信息 public class CourseList{ private String Course; //other fields @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public class CourseList{
private String Course;
//other fields
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private <Set>Student students;
//Getters and Setters
公共类课程列表{
私人弦乐课程;
//其他领域
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私立学生;
//接球手和接球手
}
我对延迟加载的理解是,数据库的获取只在显式调用特定字段时发生。我们应该只看到json中出现的课程细节,而不是地址细节。为什么我们也看到地址细节
如果我对懒散的理解不正确,或者由于某种原因,它不适用于这种情况,有人能帮我澄清一下吗?谢谢
// ^_^?
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Link Student student;
要返回课程列表
包括列表
,需要创建响应
或学生
实体,必须确保没有@ManyToOne
到课程列表
,否则会发生堆栈溢出错误
本教程还提到了该问题:
要返回课程列表
包括列表
,需要创建响应
或学生
实体,必须确保没有@ManyToOne
到课程列表
,否则会发生堆栈溢出错误
本教程还提到了这个问题:您的JSON库将递归读取对象的所有属性,以便生成输出。因此,它正在访问学生集 根据我的经验,这里有三种可能的结果:
我遇到了这个问题,我不得不做出第三个选择。我的第一次尝试给了我一个异常(选项1),但随后我强制从延迟加载集读取,只是为了获取JSON序列化的数据。您的JSON库将递归读取对象的所有属性,以便生成输出。因此,它正在访问学生集 根据我的经验,这里有三种可能的结果:
我遇到了这个问题,我不得不做出第三个选择。我的第一次尝试给了我一个异常(选项1),但随后我强制从延迟加载集读取,只是为了获取JSON序列化的数据。Spring Boot注册了一个OpenEntityManagerViewInterceptor。Spring引导默认配置
Spring.jpa.open-in-view=true
。
如果要禁用该行为,请添加配置spring.jpa.open-in-view=false
注册OpenEntityManagerInViewInterceptor。绑定JPA EntityManager
在请求的整个处理过程中发送到线程
Spring Boot注册OpenEntityManagerViewInterceptor。Spring引导默认配置
Spring.jpa.open-in-view=true
。
如果要禁用该行为,请添加配置spring.jpa.open-in-view=false
注册OpenEntityManagerInViewInterceptor。绑定JPA EntityManager
在请求的整个处理过程中发送到线程
恐怕你误解了我的问题。我知道无限循环问题(链接所指)。我的问题是为什么postman JSON输出会在结果中显示延迟加载的学生对象。恐怕您误解了我的问题。我知道无限循环问题(链接所指)。我的问题是为什么postman JSON输出会在resultIn point 2中显示惰性加载的学生对象,你是说JSON序列化也会强制用于惰性对象吗?这违背了懒惰的目的,还是像Postman这样的工具正在进行这种强制加载?你的JSON库根本不知道懒惰加载是什么,答案就是这样的。在没有任何进一步的处理指示的情况下,它会像其他任何字段一样尝试序列化惰性字段:这会触发数据库加载,这可能会成功,也可能不会成功,这取决于您的JPA提供程序和其他各种情况。这就是为什么存在一个Jackson Hibernate模块来帮助解决这些问题:在第2点中,您是说JSON序列化也被强制用于惰性对象吗?这违背了懒惰的目的,还是像Postman这样的工具正在进行这种强制加载?你的JSON库根本不知道懒惰加载是什么,答案就是这样的。在没有任何进一步的处理指示的情况下,它会像其他任何字段一样尝试序列化惰性字段:这会触发数据库加载,这可能会成功,也可能不会成功,这取决于您的JPA提供程序和其他各种情况。这就是为什么存在Jackson Hibernate模块来帮助解决这些问题:您使用Spring数据Jpa吗?是的,Spring数据Jpa。您使用Sp吗