您的位置:首页 > 编程语言 > Java开发

spring jpa 实体互相引用返回restful数据循环引用报错的问题

2016-09-08 17:09 344 查看

spring jpa 实体互相引用返回restful数据循环引用报错的问题

Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里

Problem
对象,引用了标签列表
ProblemLabel


ProblemLabel
对象,引用了所属
Problem


这样构成了互相引用,导致递归循环内存溢出异常:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.test.api.problem.domain.ProblemLabel["problem"]->com.test.api.problem.domain.Problem["label"]->org.hibernate.collection.internal.PersistentBag[0]->com.test.api.problem.domain.ProblemLabel["problem"]->com.test.api.problem.domain.Problem["label"]->org.hibernate.collection.internal.PersistentBag[0]->com.test.api.problem.domain.ProblemLabel["problem"]

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
@Table(name = "tx_test_problem")
public class Problem {

private static final long serialVersionUID = 761718569700121659L;

/**
* 问题概述
*/
private String qutline;

/**
* 问题补充
*/
private String supplement;

/**
* 创建时间
*/
private Date createDate;

private Account user;

private List<ProblemLabel> labeles;

public String getQutline() {
return qutline;
}

public void setQutline(String qutline) {
this.qutline = qutline;
}

public String getSupplement() {
return supplement;
}

public void setSupplement(String supplement) {
this.supplement = supplement;
}

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
public Account getUser() {
return user;
}

public void setUser(Account user) {
this.user = user;
}

@Column(updatable = false)
public Date getCreateDate() {
return createDate;
}

public void setCreateDate(Date createDate) {
this.createDate = createDate;
}

@OneToMany(mappedBy = "problem", fetch = FetchType.EAGER) //主表上添加mappedBy,指向关联表的关联实体problem即可
public List<ProblemLabel> getLabel() {
return labeles;
}

public void setLabel(List<ProblemLabel> labeles) {
this.labeles = labeles;
}
}

Problem包含了标签列表
private List<ProblemLabel> labeles;


@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
@Table(name = "tx_test_problem_label")
public class ProblemLabel {

private static final long serialVersionUID = -789585899105406906L;

private String labelVal;
private String problemId;

private Problem problem;

@ManyToOne
@JoinColumn(name = "problem_id")
public Problem getProblem() {
return problem;
}

public void setProblem(Problem problem) {
this.problem = problem;
}

public String getLabelVal() {
return labelVal;
}

public void setLabelVal(String labelVal) {
this.labelVal = labelVal;
}

}

ProblemLabel包含了标签列表
private Problem problem;


在不需要展现一方的属性上添加忽略注解
@JsonIgnore
即可。修改后的
ProblemLabel
如下。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
@Table(name = "tx_test_problem_label")
public class ProblemLabel {

private static final long serialVersionUID = -789585899105406906L;

private String labelVal;
private String problemId;

private Problem problem;

@ManyToOne
@JoinColumn(name = "problem_id")
@JsonIgnore //将不需要返回的属性上添加忽略
public Problem getProblem() {
return problem;
}

public void setProblem(Problem problem) {
this.problem = problem;
}

public String getLabelVal() {
return labelVal;
}

public void setLabelVal(String labelVal) {
this.labelVal = labelVal;
}

}

这样便可解决bean互相引用返回json数据时递归调用的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐