多对多关系返回许多嵌套结果

Many to Many relationship is returning many nested results

我有两个表 [1]users 和 [2] employee_group
我正在尝试实现 ManyToMany 关系,这就是我使用注释

实现的方式
@Entity
@Table(name = "employee_group")
public class EmployeeGroup {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private long id;
    
    @ManyToMany(mappedBy = "employeeGroups")
    private List<User> users;
    .........
    // other properties 
}

@Entity
@Table(name = "users")
public class User{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private long id;

    @ManyToMany
    @JoinTable(name = "emp_group_map", 
    joinColumns = { @JoinColumn(name = "fk_user") }, 
    inverseJoinColumns = { @JoinColumn(name = "fk_emp_group") })
    private List<EmployeeGroup> employeeGroups;
    .........
    // other properties 
}

期望:我有一个用户(例如:userId 100)和该用户所属的两个员工组,所以我期望当我尝试获取该用户时通过 userId saay 100 它将获得带有员工组列表的用户详细信息,并且此 employeeGroups 将有两条记录。

问题: 这个 returns 嵌套结果如下:

{
    "id": 11,       
    "employeeGroups": [
        {
            "id": 1,           
            "users": [
                {
                    "id": 11,                   
                    "employeeGroups": [
                        {
                            "id": 1,                            
                            "users": [
                                {
                                    "id": 11,                                   
                                    "employeeGroups": [
                                        {
                                            "id": 1,                                            
                                            "users": [
                                                {
                                                    "id": 11,                                                   
                                                    "employeeGroups": [
                                                        {                                                            
                                                            "id": 1,                                                            
                                                            "users": [
                                                                {
                                                                    "id": 11,

我卡在这里并没有弄清楚到底哪里出了问题。我正在使用 Spring-Boot 2.6.4.

Jackson 将进入 User,看到 employeeGroup 所以它进入那个,它有一个 List<User> 所以它开始遍历那些,再次得到用户,然后是其员工组等。 这会导致潜在的 OOM。

@JsonManagedReference@JsonBackReference可能对你有用

此外,考虑使用 DTO,因为我假设您正在尝试 return 控制器之外的用户(因此 jackson 将映射它)。

使用 DTO Data Transfer Object,您将从控制器 de-couple 实体和 returned DTO 并且更容易自定义和处理 returned以及它的结构。