繁体   English   中英

通过@OneToMany 和@ManyToOne 使用 JPA hibernate 获得无限递归

[英]getting infinite recursion with JPA hibernate by @OneToMany and @ManyToOne

我有一个无法解决的问题,我也用 JsonIgnore 尝试过,但也没有用。 我有一个待办事项列表,我希望我的任务是 output 我给他们的用户 ID。 问题是因为每个用户都有一个任务数组,这些任务给了我一个无限循环的任务和用户。

在此处输入图像描述

那是我的代码:

用户:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private Set<Task> tasks;

任务:

@Entity
public class Task {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;

然后我有普通的 getter 和 setter 以及一个 toString 方法。

使用 @JsonManagedReference 和 @JsonBackReference

用户:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Task> tasks;

任务:

@Entity
public class Task {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@JsonBackReference
private User user;

在反序列化中,@OneToMany 或 @ManytoOne 关系字段也被调用。 最好为响应创建响应 class 而不是实体 class 并在其中设置您的实体值。

public class TaskResponse {
    private int id;
    private String name;
    private UserResponse user;
    ...setter getter
}
public class UserResponse {
   private int id;
   private String name;
   ...setter getter
}

尝试使用以下注释:

//--1
@OneToMany(mappedBy = "user", cascade = {CascadeType.ALL})
@JsonManagedReference
private Set`<Task>` tasks;

//--2
**@ManyToOne(cascade = CascadeType.ALL)**
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;

我找到了解决方案,我不得不将我的 getUser() 方法更改为:

    public int getUser() {
    return user.getId();
}

现在我只从任务中获取 userId 而不是从用户那里获取所有内容,这就是我不再获得递归的原因。

在此处输入图像描述

我希望我现在可以帮助将来也有这个问题并且在互联网上找不到任何解决方案的人

我个人不喜欢混淆数据库表示和序列化等职责。 在 JPA 中有一个双向图是完全可以的,唯一的问题是当您想将此双向图序列化为单向树结构时,这就是为什么我会根据您的用例为单向树创建第二个表示:有一个带有浅“用户” object 的“任务”,其中包含您在任务上下文中需要的那些值,或者有一个“用户”,其中包含一个浅“任务”对象列表,其中恰好包含您在一个上下文中需要的那些值用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM