問題:
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;
}