Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 如何在@ManyToOne JPA中停止重复对象?_Java_Json_Hibernate_Spring Boot_Jackson - Fatal编程技术网

Java 如何在@ManyToOne JPA中停止重复对象?

Java 如何在@ManyToOne JPA中停止重复对象?,java,json,hibernate,spring-boot,jackson,Java,Json,Hibernate,Spring Boot,Jackson,我的家长班级: @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List<Child> child; public List<Child> getChild() { return child; } public void setChild(List<Child> child) { this.child = child; } 错误: Caused by:

我的家长班级:

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> child;

public List<Child> getChild() {
    return child;
}

public void setChild(List<Child> child) {
    this.child = child;
}
错误:

Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:626) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView.render(ErrorMvcAutoConfiguration.java:227) ~[spring-boot-autoconfigure-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
... 38 common frames omitted
在浏览器中:


它看起来像@OneToMany,来自调用子对象fine的父实体。但是子实体中的@manytone通过再次调用父对象并重复调用它来执行相同的操作。如何避免此问题?

在子类中,忽略使用@JsonIgnore序列化/期望序列化父类

@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REF_ID")
private Parent parent;

public Parent getParent() {
   return parent;
}

public void setParent(Parent parent) {
    this.parent = parent;
 }

在子类中,忽略使用@JsonIgnore序列化/期望序列化父类

@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REF_ID")
private Parent parent;

public Parent getParent() {
   return parent;
}

public void setParent(Parent parent) {
    this.parent = parent;
 }
我想这样做:

父母亲 发生了什么事? 这与JPA无关。@Entity模型提供了访问字段的方法。要在API中表示它们,需要序列化它们。序列化程序不知道该级别上的实体(在该级别上它将知道持久性层。这将违反规则)。因此,必须提供序列化程序提示,就像在实体模型上使用@manytone、@OneToMany一样。序列化程序迭代类上的get方法,并调用它们。如果没有提示,您将得到一个循环引用,因为您先调用父对象,然后再获取子对象。序列化子对象后,再次调用父对象

参考文献 :注释,用于指示带注释的属性是字段之间双向链接的一部分;它的角色是“父级”(或“转发”)链接。

:用于指示关联属性是字段之间双向链接的一部分的注释;它的角色是“child”(或“back”)链接,我想这样使用:

父母亲 发生了什么事? 这与JPA无关。@Entity模型提供了访问字段的方法。要在API中表示它们,需要序列化它们。序列化程序不知道该级别上的实体(在该级别上它将知道持久性层。这将违反规则)。因此,必须提供序列化程序提示,就像在实体模型上使用@manytone、@OneToMany一样。序列化程序迭代类上的get方法,并调用它们。如果没有提示,您将得到一个循环引用,因为您先调用父对象,然后再获取子对象。序列化子对象后,再次调用父对象

参考文献 :注释,用于指示带注释的属性是字段之间双向链接的一部分;它的角色是“父级”(或“转发”)链接。


:用于指示关联属性是字段之间双向链接的一部分的注释;它的作用是“child”(或“back”)链接,从可接受的答案中提出的注释和其他注释基本上是告诉spring boot不要阅读它们。是的,它能够解决循环问题,但不能完全解决返回预期json输出的问题

相反,我对这些实现做了一些调整,它对我很有用

交换参考注释

  • 父实体->@JsonManagedReference
  • 子实体->@JsonBackReference
代码片段示例:

Parent.java(类)


上面的交换对我很有用。

从可接受的答案中提出的注释和其他注释基本上是告诉spring boot不要阅读它们。是的,它能够解决循环问题,但不能完全解决返回预期json输出的问题

相反,我对这些实现做了一些调整,它对我很有用

交换参考注释

  • 父实体->@JsonManagedReference
  • 子实体->@JsonBackReference
代码片段示例:

Parent.java(类)


上面的交换对我很有用。

你没有在JPA中重复任何内容。您正在重复生成JSON,这与JPAAPI无关。是的,Neil得到了。谢谢。你在JPA里没有重复任何东西。您正在重复生成JSON,这与JPAAPI无关。是的,Neil得到了。谢谢,没问题。如果这有效,请记住将其标记为答案。有疑问,我们不能在JPA本身中这样做吗?它与JPA无关。JPA代表资源。在序列化时,默认情况下会调用这些方法。您必须“提示”序列化程序,使其具有有关如何序列化的其他详细信息。为了更好地解释,我添加了一个解释。希望这会有帮助,没问题。如果这有效,请记住将其标记为答案。有疑问,我们不能在JPA本身中这样做吗?它与JPA无关。JPA代表资源。在序列化时,默认情况下会调用这些方法。您必须“提示”序列化程序,使其具有有关如何序列化的其他详细信息。为了更好地解释,我添加了一个解释。希望这会有帮助。在我看来这是最好的解决方案。有人知道上解和这个解的区别吗?哪一个是brian的解和Amer的解?我认为这是最好的解。有人知道上解和这个解的区别吗?哪一个是布赖恩的解决方案和阿默尔的解决方案?
@JsonBackReference
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> child;
@JsonManagedReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REF_ID")
private Parent parent;
@JsonManagedReference
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = CascadeType.ALL) //"parent" -> is the name defined by child class
private List<Child> childs;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "parent_id") //parent_id is the foreign key for child
private Parent parent; //object name defined from Parent class