如何在拥有@ManyToMany关系JPA springboot的同时摆脱循环冗余

问题描述 投票:0回答:2

我是Spring靴的新手(但曾在Laravel工作)。我在@ManyToMany关系中面临循环冗余的问题。让我们看一下场景-

我得到的响应(获取与角色具有许多关系的用户列表)-

enter image description here

下面是关联表的ER图,用于管理usersroles表之间的多对多关系。

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;

}

如何解决这个问题?我在这里做错了吗?

java spring spring-boot jpa orm
2个回答
0
投票

由于您是直接获取列表。在指定了映射的任何地方,您都必须提及注释@JsonIgnore。在任何地方,我并不是真的到处都是。只需使用注释,看看它如何工作。

编辑->只需在已将其映射到用户表的角色表中进行即可。然后它将在获取数据时跳过用户映射。

@JsonIgnore
 private List<User> users;

0
投票

最简单的方法可能是使用List<T>注释来注释@JsonIgnoreProperties,以打破循环依赖性。

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


@JsonIgnoreProperties("roles")
private List<User> users;
© www.soinside.com 2019 - 2024. All rights reserved.