问题:
JPA 在双向映射时, 会相互包含对方的实例, 相互引用, 造成递归迭代, 堆栈溢出 (java.lang.StackOverflowError).
分析:
在后端向前端传递的时候会将数据序列化, 转为 JSON, 这时会出现循环引用造成堆栈溢出
解决方案:
解决方法就是在转换 JSON 时忽略循环字段. 首先确定项目使用的 JSON 包是哪一个 (jackjson 或 fastjson), 寻找相应的注解忽略某一字段.
jackson 包对应的相关注解: @JsonIgnoreProperties,@JsonIgnore
fastjson 包对应的相关注解: @JSONField(serialize = false)
注意: 在使用注解时一定要注意引入的包是否正确, 如果和自己使用的 JSON 包不对应的话, 注解是不生效的.
附代码:
- // 我的项目使用的 alibaba 的 fastjson 包
- @Data
- class SOStudent {
- // ... ... 省略其他字段
- @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
- @JoinColumn(name="classId")
- @JSONField(serialize = false)
- private SOClass class;
- }
- @Data
- class SOClass {
- @Id
- @GeneratedValue
- private Long id
- // ... ... 省略其他字段
- @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER)
- private List<SOStudent> students;
- }
来源: http://www.bubuko.com/infodetail-3098429.html