Как избавиться от избыточности cycli c, имея отношение @ManyToMany JPA springboot - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок ie в загрузке Spring (но работал в Laravel). Я сталкиваюсь с проблемой избыточности циклических c в отношении @ManyToMany. Давайте рассмотрим сценарий go -

Какой ответ я получаю (выбирая список пользователей, который имеет много-много связей с ролями) -

enter image description here

Ниже приведена ER-диаграмма связанных таблиц для управления отношениями "многие ко многим" между таблицами users и roles.

enter image description here

Пользовательский класс сущности имеет следующий код -

@Entity
@Where(clause = "deleted_at IS NULL")
@SQLDelete(sql = "UPDATE users SET deleted_at = CURRENT_TIMESTAMP WHERE id = ?", check = ResultCheckStyle.COUNT)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "users")
@JsonIgnoreProperties(
        value = {"createdAt", "updatedAt", "deletedAt"}
)
public class User {

    @Id
    @Column(name = "id", updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "name", nullable = false)
    @NotBlank(message = "Name field can not be empty")
    private String name;

    .....
    .....
    .....


    @ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER)
    @JoinTable(name = "user_roles",joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

}

А роль сущности выглядит следующим образом -

@Entity
@Table(name = "roles")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SQLDelete(sql = "UPDATE roles SET deleted_at = CURRENT_TIMESTAMP WHERE id = ?", check = ResultCheckStyle.COUNT)
@Where(clause = "deleted_at IS NULL")
@JsonIgnoreProperties(
        value = {"createdAt", "updatedAt", "deletedAt"}
)
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private long id;

    @Column(name = "title")
    @NotBlank(message = "Title field must be not null")
    private String title;

    ......
    ......
    ......

    @OneToMany(targetEntity = User.class, fetch = FetchType.EAGER)
    @JoinTable(name = "user_roles",joinColumns = @JoinColumn(name = "role_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"))
    private List<User> users;

}

Как решить эту проблему? Что я тут не так делаю?

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Проще всего было бы аннотировать List<T> с помощью аннотации @JsonIgnoreProperties, чтобы разорвать зависимости cycli c.

@JsonIgnoreProperties("users")
private List<Role> roles;


@JsonIgnoreProperties("roles")
private List<User> users;
0 голосов
/ 12 февраля 2020

Вы можете аннотировать users в пределах Role с помощью @JsonBackReference.

0 голосов
/ 10 февраля 2020

Поскольку вы получаете список напрямую. Вы должны будете упомянуть аннотацию @JsonIgnore везде, где вы указали отображение. Я не имею в виду буквально везде. Просто используйте аннотацию и посмотрите, как она работает.

Правка -> Просто сделайте это в таблице ролей, где вы сопоставили ее с пользовательской таблицей. Затем он пропустит сопоставление пользователя при получении данных.

@JsonIgnore
 private List<User> users;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...