发生了一个这样的错误
Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException:
Could not write JSON document: Infinite recursion (StackOverflowError)
解决参照:
http://blog.youkuaiyun.com/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); }
查询大指标的同时也会级联获取
@Override public List<TESTXifenzhibiao> queryAllXIFENDazhibiao(int fatherid){ List<TESTXifenzhibiao> t = new ArrayList<>(); return t; }