You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jackson序列化/反序列化物料清单(BOM)的关联方实体

问题根因

你当前遇到的问题是两个注解的特性冲突导致的:

  • @JsonBackReference 的原生作用就是标记该字段在序列化时直接跳过,所以你配置了该注解的firstParty、secondParty字段不会出现在序列化结果中
  • 去掉该组注解后,序列化逻辑会进入无限循环:Party对象序列化关联的PartyRelationship集合 -> PartyRelationship序列化关联的Party对象 -> 新的Party对象又会序列化它自己的关联关系集合,最终触发StackOverflowError

解决方案

最适配你「仅序列化一级层级」需求的方案是用@JsonIgnoreProperties注解切断二级递归,无需自定义序列化逻辑,修改步骤如下:

  1. 删除Party类中两个字段上的@JsonManagedReference注解
  2. 删除PartyRelationship类中两个字段上的@JsonBackReference注解
  3. 给PartyRelationship类的firstParty、secondParty字段添加@JsonIgnoreProperties,忽略Party对象里的关联关系集合字段,避免递归序列化

修改后的PartyRelationship类对应字段配置如下:

@ManyToOne(optional = false)
@JoinColumn(name = "first_party_id", referencedColumnName = "party_id")
@JsonProperty("firstParty")
@JsonIgnoreProperties({"firstParties", "secondParties"}) // 忽略关联关系字段,切断递归
private PartyDO firstParty;

@ManyToOne(optional = false)
@JoinColumn(name = "second_party_id", referencedColumnName = "party_id")
@JsonProperty("secondParty")
@JsonIgnoreProperties({"firstParties", "secondParties"}) // 忽略关联关系字段,切断递归
private PartyDO secondParty;

注意事项

你的关联关系配置的是FetchType.LAZY懒加载,序列化前需要确保关联的Party对象已经被加载:

  • 可以将关联字段的fetch属性改为FetchType.EAGER
  • 或者在查询Party对象的DAO层逻辑中,使用join fetch语句主动加载关联的firstParty、secondParty字段,避免懒加载异常

内容的提问来源于stack exchange,提问作者suitej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:54:03