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

本文共 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://wusva.baihongyu.com/

你可能感兴趣的文章
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
吉林出差所见、所闻、所感
查看>>
RHEL7修改root用户密码
查看>>
mysqldump导出 timestamp类型数据 时区偏差8小时
查看>>
我的友情链接
查看>>
中小型企业如ERP选型四大标准
查看>>
笔记——quota磁盘配额
查看>>
索引表批量数据装载
查看>>
@Value("#{}")与@Value("${}")的区别
查看>>
Zabbix邮件报警设置方法
查看>>
20145328 《信息安全系统设计基础》第6周学习总结
查看>>