多对多关系中的json无限递归

时间:2020-07-12 04:20:03

标签: spring-boot spring-data-jpa spring-restcontroller spring-rest spring-json

@Entity
@Table(name = "people")
public class People {
@ManyToMany(fetch = FetchType.LAZY,
               cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, 
                           CascadeType.REFRESH})
@JoinTable(name = "bank_people",
                     joinColumns = @JoinColumn(name = "people_id"),
                     inverseJoinColumns = @JoinColumn(name = "bank_id"))
private List<Bank> banks;

}
     
 @Entity
 @Table(name = "bank")
 public class Bank {
 @ManyToMany(fetch = FetchType.LAZY,
                            cascade = {CascadeType.DETACH, CascadeType.MERGE, 
                                  CascadeType.PERSIST, CascadeType.REFRESH})
 @JoinTable(name = "bank_people",
                        joinColumns = @JoinColumn(name = "bank_id"),
                        inverseJoinColumns = @JoinColumn(name = "people_id"))
 private List<People> peoples;
 }

当我使用多对多关系时,它会在json中无限循环 所以我使用了@JsonBackReference和@JsonManagedReference,但是返回如下:

当我搜索/ api / peoples

[
{
    "id": 1,
    "name": "John",
    "accountNumber": "123456",
    "accountType": "SA",
    "banks": [
        {
            "id": 1,
            "bankName": "Indian Bank",
            "branch": "Attur",
            "branchCode": "IDIBATR01"
        },
        {
            "id": 2,
            "bankName": "State Bank of India",
            "branch": "Salem",
            "branchCode": "SBIASLM01"
        }
    ]
},

搜索/ api / banks时,它将仅返回银行,而不返回人

[
{
    "id": 1,
    "bankName": "Indian Bank",
    "branch": "Attur",
    "branchCode": "IDIBATR01"
},
{
    "id": 2,
    "bankName": "State Bank of India",
    "branch": "Salem",
    "branchCode": "SBIASLM01"
}

]

请帮助重新定义如何像第一个一样在/ api / banks中返回人员

1 个答案:

答案 0 :(得分:0)

@JsonManagedReference和@JsonBackReference的工作原理

@JsonManagedReference是参考的前一部分-通常被序列化的参考。 @JsonBackReference是参考的后半部分–序列化将忽略它。

这意味着省略了一侧的序列化,而另一侧将被正常序列化。这就是为什么People Inside中的Bank进行序列化而Bank in People被省略的原因。

如果您希望双方正常序列化,请使用@JsonIdentityInfo

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class People { ... }

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Bank { ... }

此处id应该是用于识别每个实体的主键或唯一键。