Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @懒散加载和JsonOutput_Java_Json_Spring_Jpa_Jackson - Fatal编程技术网

Java @懒散加载和JsonOutput

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)

正在处理使用Spring/JPA/Rest的项目。 我们有一个类,它有一个@OneToMany字段(在下面的例子中是Student),标记为延迟加载。然而,当我们在postman中测试输出时,我们会看到课程的完整json以及所有学生的详细信息

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库将递归读取对象的所有属性,以便生成输出。因此,它正在访问学生集

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

  • JSON序列化发生在JPA会话之外,因此对象被分离。由于学生集是惰性加载的,因此将出现异常

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

  • JSON序列化发生在JPA会话之外,但是您已经以某种方式访问了在此之前和JPA会话内部设置的学生。数据已提取,可在分离的对象上使用


  • 我遇到了这个问题,我不得不做出第三个选择。我的第一次尝试给了我一个异常(选项1),但随后我强制从延迟加载集读取,只是为了获取JSON序列化的数据。

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

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

  • JSON序列化发生在JPA会话之外,因此对象被分离。由于学生集是惰性加载的,因此将出现异常

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

  • JSON序列化发生在JPA会话之外,但是您已经以某种方式访问了在此之前和JPA会话内部设置的学生。数据已提取,可在分离的对象上使用


  • 我遇到了这个问题,我不得不做出第三个选择。我的第一次尝试给了我一个异常(选项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吗