@OneToMany и @ManyToOne получают бесконечную рекурсию с использованием JPA - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть проблема, которую я не могу решить, я тоже пробовал ее с JsonIgnore, но она тоже не работала. У меня есть список дел, и я хочу, чтобы мои задачи выводили идентификатор пользователя, который я им дал. Проблема в том, что у каждого пользователя есть массив задач, задачи дают мне бесконечное число задач и пользователей *

enter image description here

Код:

Пользователь:

@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;

, тогда у меня есть нормальный метод получения и установки и метод toString.

Ответы [ 5 ]

0 голосов
/ 08 апреля 2020

Мне лично не нравится смешивать обязанности, такие как представление базы данных и сериализация. Вполне нормально иметь двунаправленный граф в JPA, единственная проблема возникает, когда вы хотите сериализовать этот двунаправленный граф в однонаправленную древовидную структуру, поэтому я бы создал второе представление для однонаправленного дерева в зависимости от вашего варианта использования: иметь «задачу» с мелким «пользовательским» объектом, содержащим именно те значения, которые вам нужны в контексте задачи, или иметь «пользователя» со списком мелких объектов «задачи», содержащих именно те значения, которые вам нужны в контексте пользователь.

0 голосов
/ 08 апреля 2020

Я нашел решение, мне пришлось изменить метод getUser () на:

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

, теперь я получаю только userId из задачи, а не все от User, поэтому я не получите больше рекурсии 1012 *

0 голосов
/ 08 апреля 2020

В десериализации также называются поля @OneToMany или @ManytoOne Relation. Лучше создать класс ответа для ответа, а не класс сущности и установить в нем значение вашей сущности.

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
}
0 голосов
/ 08 апреля 2020

Попробуйте использовать следующие аннотации:

//--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;
0 голосов
/ 08 апреля 2020

Используйте @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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...