簡體   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