
lombok 的 @tostring 注解在双向 jpa 关系中会触发无限递归,即使已配置 @jsonmanagedreference/@jsonbackreference,因其仅作用于 jackson 序列化,不影响 tostring 生成。
lombok 的 @tostring 注解在双向 jpa 关系中会触发无限递归,即使已配置 @jsonmanagedreference/@jsonbackreference,因其仅作用于 jackson 序列化,不影响 tostring 生成。
在使用 Lombok 的 @ToString 注解时,它会自动为所有字段(包括关联实体)生成字符串表示逻辑。当存在双向关联(如 SchemeCode ↔ MultilingualTemplateV2)时,SchemeCode.toString() 尝试打印 multilingualTemplates 列表,而每个 MultilingualTemplateV2 的 toString() 又会尝试打印其 schemeCode 字段——从而形成无限嵌套调用链,最终引发 StackOverflowError。值得注意的是,@JsonManagedReference 和 @JsonBackReference 仅影响 Jackson 的 JSON 序列化行为,对 Lombok 生成的 toString() 完全无效。
根本解决方法:显式排除循环引用字段
在 SchemeCode 实体中,需使用 @ToString.Exclude 明确标注双向关联集合字段,阻止其参与 toString() 构建:
@Entity
@Table(name = "scheme_code_templates")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class SchemeCode {
@Column(name = "associated_pushcode")
Integer associatedPushcode;
@NotNull
String description;
@Id
@NotNull()
String schemeCode;
@OneToMany(mappedBy = "schemeCode", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonBackReference
@ToString.Exclude // ✅ 关键修复:禁止 toString 包含该字段
List<MultilingualTemplateV2> multilingualTemplates;
}同理,若 MultilingualTemplateV2 的 toString() 也需避免反向引用(例如调试时打印单个模板),可在其 schemeCode 字段上添加 @ToString.Exclude:
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "associated_schemecode") @JsonManagedReference @ToString.Exclude // 可选:按需排除,避免反向触发 SchemeCode schemeCode;
其他最佳实践建议:
- 慎用 FetchType.EAGER:当前 SchemeCode.multilingualTemplates 配置为 EAGER,会导致每次查询 SchemeCode 时强制加载全部翻译模板,易引发 N+1 查询或内存膨胀。建议改为 FetchType.LAZY,并在需要时通过 @EntityGraph 或 JOIN FETCH 显式加载。
- 避免在日志/调试中直接打印实体:如 System.out.println(schemeCode.getMultilingualTemplates()),因 PersistentBag.toString() 会触发懒加载并递归调用 toString()。应改用 size()、stream().map(...).toList() 等安全方式观察数据。
- 验证数据库外键约束:确保 ALTER TABLE ... FOREIGN KEY 语句已成功执行,并检查 Oracle 中约束状态(SELECT constraint_name, status FROM user_constraints WHERE table_name = 'MULTILINGUAL_TEMPLATE_V2'),避免因约束失效导致 JPA 关联异常。
通过 @ToString.Exclude 精准控制字符串输出范围,即可彻底消除由 Lombok 自动生成引发的无限递归问题,同时保持 JSON 序列化与 JPA 关联逻辑的完整性。

















