当前位置: 首页 > 知识库问答 >
问题:

如何修复Spring启动一对多双向无限循环?

吕作人
2023-03-14

我正在尝试使用SpringBoot和SpringDataJPA创建一对多的双向映射。请查看下面的实体

雇主实体

@Entity  
public class Employer  
{  
private Long id;  
private String employerName;  
private List<Employee> employees;  

@Id  
@GeneratedValue(strategy=GenerationType.AUTO)  
public Long getId()  
{  
    return id;  
}  
public void setId(Long id)  
{  
    this.id = id;  
}  
public String getEmployerName()  
{  
    return employerName;  
}  
public void setEmployerName(String employerName)  
{  
    this.employerName = employerName;  
}  

@OneToMany(cascade=CascadeType.ALL, mappedBy="employer")  
public List<Employee> getEmployees()  
{  
    return employees;  
}  
public void setEmployees(List<Employee> employees)  
{  
    this.employees = employees;  
}  
} 

员工实体

@Entity  
public class Employee  
{  
private Long id;  
private String employeeName;  
private Employer employer;  

@Id  
@GeneratedValue(strategy=GenerationType.AUTO)  
public Long getId()  
{  
    return id;  
}  
public void setId(Long id)  
{  
    this.id = id;  
}  
public String getEmployeeName()  
{  
    return employeeName;  
}  
public void setEmployeeName(String employeeName)  
{  
    this.employeeName = employeeName;  
}  
@ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)  
public Employer getEmployer()  
{  
    return employer;  
}  
public void setEmployer(Employer employer)  
{  
    this.employer = employer;  
}  
}  

雇主回购

public interface EmployerServices extends JpaRepository<Employer, Long> {
}

雇员回购

public interface EmployeeServices extends JpaRepository<Employee, Long> {
}

REST控制器是

 @RestController
 public class Controller {
 @Autowired EmployeeServices employeeServices;
 @Autowired EmployerServices employerServices;
 @GetMapping("/getempr")
 public Object getempr(){
    return employerServices.findOne(1L);
 }
}

它看起来像一个内讧循环,我的服务器抛出错误getOutputStream()已被调用用于此响应。

 I used @JsonBackReference & @JsonManagedReference 

注释,但问题是它的工作方式像一个对许多

 {
   "id":1,
   "employerName":"employer",
   "employees":[
     {"id":1,"employeeName":"emp1"},
     {"id":2,"employeeName":"emp2"}
   ]
}  

如果我想和雇主达成多对一的共识。输出是

 [
  {
   "id":1,
   "employeeName":"emp1"
  },
  {
    "id":2,
    "employeeName":"emp2"}
 ]

它没有向我显示雇主的详细信息。

请告诉我我做错了什么。提前谢谢!!

共有3个答案

洪胤
2023-03-14

您可以通过两个带注释的修改来解决问题。
Employer.class

@Entity
public class Employer {
    private Long id;
    private String employerName;

    @OneToMany(cascade = CascadeType.ALL,
            mappedBy = "employer",
            orphanRemoval = true)
    private List<Employee> employees;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmployerName() {
        return employerName;
    }

    public void setEmployerName(String employerName) {
        this.employerName = employerName;
    }

    public List<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }
}


Employee.class

@Entity
public class Employee {
    private Long id;
    private String employeeName;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employer_id")
    private Employer employer;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public Employer getEmployer() {
        return employer;
    }

    public void setEmployer(Employer employer) {
        this.employer = employer;
    }
}

有关更多信息,请访问此链接。

林曦之
2023-03-14

对于JSON,双向映射是一个问题。使用以下属性。

@JsonIgnoreProperties("employer")
@JsonIgnoreProperties("employees")

请继续抓取类型。

希望这能奏效。

何乐
2023-03-14

不要使用@JsonBackReference@JsonManagedReference尝试使用注释@JsonIgnoreProperties

@JsonIgnoreProperties("employer")
private List<Employee> employees;  

@JsonIgnoreProperties("employees")
private Employer employer;  

它阻止Jackson渲染关联对象的指定属性。

 类似资料:
  • 问题内容: 有一个使用-情况我从来没见过漂亮的实现。 是或多或少的静态结构。将Pages添加到右侧(添加到Model并显示它)并不难,但是,应该有一个很好用的解决方案来扩展PagerAdapter(或其某些子类),以便它可以双向扩展。 我可以想象这样的适配器接口 与Collections Iterator相似,但是是双向的。 其中索引/位置不限于0以下,而是可以使用Integer类型的整个范围。

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 问题内容: 我在与JoinTables进行双向一对多关联时遇到了一些问题。这就是我得到的: A类: B类: 如果创建A和B的实例,请将B的实例添加到A并保存。有用。但是,当我重新加载A的实例并尝试访问B的集合时,它将引发LazyInitializationError并显示消息“对加载集合的非法访问”。 我在哪里错了?:)谁能指出我一个使用联接表的双向关联示例。在所有权保留为A类的地方,我搜索了hi

  • 问题内容: 我的实体中存在双向多对多关系。请参阅以下示例: 当我尝试将其序列化为JSON时,出现以下异常: “ java.lang.IllegalArgumentException:无法处理托管/反向引用’COLLABORATION_TAG’:反向引用类型(java.util.Set)与托管类型(foo.Collaboration)不兼容。 实际上,我知道这很有意义,因为javadoc明确声明您不

  • 我在我的实体中有一种双向的多对多关系。请参见下面的示例: 当我尝试将其序列化为JSON时,我得到了以下异常:' “java.lang.IllegalArgumentException:无法处理托管/反向引用'COLLABORATION_TAG':反向引用类型(java.util.Set)与托管类型(foo.COLLABORATION)不兼容。”。 实际上,我知道这是有道理的,因为javadoc明确

  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml