如何避免父子jpa关系中的json响应递归?

Posted

技术标签:

【中文标题】如何避免父子jpa关系中的json响应递归?【英文标题】:How to avoid json response recursiveness in parent-child jpa relationship? 【发布时间】:2021-12-02 02:34:58 【问题描述】:

我有这个问题,我以前没有遇到过,所以我寻求帮助。 我有这个实体类

@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
@Entity
@Table(name = "persons")
class Person 

       @Id
       @GeneratedValue(generator = "uuid")
       @GenericGenerator(name = "uuid", strategy = "uuid2")
       @Type(type = "uuid-char")
       private UUID id;

       @Column
       private String name;

       @Column
       private int age;

       @EqualsAndHashCode.Exclude
       @ToString.Exclude
       @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
       @JoinTable(name = "person_contact", joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "contact_id", referencedColumnName = "id"))
       private Set<Person> contacts;

我遇到的主要问题是,当我将此实体映射到具有与上面显示的相同属性的某个 DTO 时,当我从控制器端检索它作为响应时,我得到递归,因为有些东西不正确“接触”关系。我怎样才能摆脱这个问题?我只想一次又一次地从集合中检索 ID、年龄和姓名,而不是集合本身。我怎么能忽略它?

【问题讨论】:

@JsonIdentityInfo. 【参考方案1】:

我看到了两种“解决”这个问题的方法:

    只需从 DTO 中删除 Set&lt;Person&gt; 属性即可。 如果您使用此属性并且只想在序列化为 JSON 时忽略它,请在字段中添加 @JsonIgnore 注释,它不会在响应中序列化。

--编辑 根据评论,您想添加此字段,并让它显示Person 集合的数据,但那些不应该显示他们的“联系人”。 您可以创建仅具有前 3 个字段的第二个 DTO 类,而不是将 Set&lt;Person&gt; 添加到主 DTO,而是添加 Set&lt;PersonContactDto&gt; 或类似名称。

【讨论】:

但我希望联系人进入我的回复但没有联系人集合。

以上是关于如何避免父子jpa关系中的json响应递归?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA:在自联接关系中的 JSON 视图上递归

如何在Vapor 3中从JSON响应中保存父子关系

JPA:在父子关系中->父未更新

如何避免使用 JPA 在实体关系中违反外键约束

JSON对象中的JavaScript递归搜索

通过递归检查父子关系C#构建树类型列表