博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring jpa 实体互相引用返回restful数据循环引用报错的问题
阅读量:7030 次
发布时间:2019-06-28

本文共 3497 字,大约阅读时间需要 11 分钟。

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
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
getLabel() { return labeles; } public void setLabel(List
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数据时递归调用的问题。

转载地址:http://qzgxl.baihongyu.com/

你可能感兴趣的文章
关于JQuery Class选择器的一点
查看>>
POJ3264 Balanced Lineup
查看>>
redis-cli 连接远程服务器
查看>>
emlog通过pjax实现无刷新加载网页--完美解决cnzz统计和javascript失效问题
查看>>
sublime 之 vitage/emmet
查看>>
代码管理(四)SVN和Git对比
查看>>
python - hadoop,mapreduce demo
查看>>
mongodb常见管理命令
查看>>
1.7 以函数对象取代函数
查看>>
Vue过渡效果之JS过渡
查看>>
Android项目实战(三):实现第一次进入软件的引导页
查看>>
Web Service基础——基础概念
查看>>
Linux2.4文件系统中vfsmount、安装点的dentry、设备的dentry之间的关系【转】
查看>>
POJ 1201 Intervals
查看>>
JAVA訪问URL
查看>>
APP接口基础学习一
查看>>
设计模式 策略模式 以角色游戏为背景
查看>>
【转】CSS和SVG中的剪切——clip-path属性和<clipPath>元素
查看>>
【C语言入门教程】5.4 递归
查看>>
UVALive 6915 Leveling Ground 倍增RMQ
查看>>