JPA一堆多循环引用错误 HttpMessageNotWritableException

来源:互联网 发布:数据结构课程设计java 编辑:程序博客网 时间:2024/05/22 12:16

发生了一个这样的错误

Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException:
Could not write JSON document: Infinite recursion (StackOverflowError)

解决参照:

http://blog.csdn.net/qq_35357001/article/details/55505659

注意:ManyToOne属性上注解:

@JsonBackReference

没有起作用,在get方法上注解成功解决无线引用导致堆栈溢出的问题。


对onetomany的一方没有加任何的注解也可以从json转换到对象


package com.troy.keeper.monomer.demo.domain;import com.fasterxml.jackson.annotation.JsonBackReference;import com.fasterxml.jackson.annotation.JsonManagedReference;import javax.persistence.*;import java.util.List;import java.util.Set;/** * 创建者: apple * 创建时间:2017/9/21. * 功能模块: */@Entity@Table(name = "testdazbibiao")public class TESTDazhibiao {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @Column(name = "NAME")    private String name;    @Column(name = "SCORE")    private String score;    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)    @JoinTable(name = "zhibao_xifenzhibiao",joinColumns ={@JoinColumn(name = "testdazbibiaoid")},inverseJoinColumns = {@JoinColumn(name ="testxifenzhibiaoid" )})    private List<TESTXifenzhibiao> children;    public List<TESTXifenzhibiao> getChildren() {        return children;    }    public void setChildren(List<TESTXifenzhibiao> children) {        this.children = children;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getScore() {        return score;    }    public void setScore(String score) {        this.score = score;    }}
package com.troy.keeper.monomer.demo.domain;import com.fasterxml.jackson.annotation.JsonBackReference;import com.fasterxml.jackson.annotation.JsonIgnore;import com.fasterxml.jackson.annotation.JsonManagedReference;import javax.persistence.*;import java.util.List;import java.util.Set;/** * 创建者: apple * 创建时间:2017/9/21. * 功能模块: */@Entity@Table(name = "testxifenzhibiao")public class TESTXifenzhibiao {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @Column(name = "NAME")    private String name;    @Column(name = "SCORE")    private String score;    @Column(name = "GETMETHOD")    private String method;    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name = "testdazbibiaoid")    //生成JSON时候忽略   //    private TESTDazhibiao TESTDazhibiao;    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)    @JoinTable(name = "xifenzhibiao_parameter",joinColumns ={@JoinColumn(name = "testxifendazbibiaoid")},inverseJoinColumns = {@JoinColumn(name ="testparameterid" )})    private List<TESTParameter> parameterList;    @JsonBackReference    public com.troy.keeper.monomer.demo.domain.TESTDazhibiao getTESTDazhibiao() {        return TESTDazhibiao;    }    public List<TESTParameter> getParameterList() {        return parameterList;    }    public void setParameterList(List<TESTParameter> parameterList) {        this.parameterList = parameterList;    }    public void setTESTDazhibiao(com.troy.keeper.monomer.demo.domain.TESTDazhibiao TESTDazhibiao) {        this.TESTDazhibiao = TESTDazhibiao;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getScore() {        return score;    }    public void setScore(String score) {        this.score = score;    }    public String getMethod() {        return method;    }    public void setMethod(String method) {        this.method = method;    }}




服务中添加大指标,同时会级联保存

public void addDazhibiao(TESTDazhibiao dazhibiao){    List<TESTXifenzhibiao> xifenzhibiaoList =dazhibiao.getChildren();    if(xifenzhibiaoList !=null) {        for (TESTXifenzhibiao xifen : xifenzhibiaoList                ) {            List<TESTParameter> parameters = xifen.getParameterList();            if(parameters != null) {                for (TESTParameter p : parameters                        ) {                    p.setTESTxifenzhibiao(xifen);                }            }            xifen.setTESTDazhibiao(dazhibiao);        }    }    tesTzhibiaoRepository.save(dazhibiao);}
查询大指标的同时也会级联获取
@Overridepublic List<TESTXifenzhibiao> queryAllXIFENDazhibiao(int fatherid){    List<TESTXifenzhibiao> t = new ArrayList<>();    return t;}