zoukankan      html  css  js  c++  java
  • spring jpa 实体互相引用返回restful数据循环引用报错的问题

    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数据时递归调用的问题。

  • 相关阅读:
    动画效果打开层 关闭层
    一个正在加载网页的进度条,加载完后,自动消失?>
    使用ASP.NET AJAX必要的配置
    css静态滤镜 + A:Hover 的效果
    可擦写的涂改文字
    各种遮罩层(lightbox)实现
    oracle 11g 安装
    SMTP协议
    javaoracle驱动包
    批量处理JDBC语句提高处理速度
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/5853754.html
Copyright © 2011-2022 走看看