问题:
JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError
)。
分析:
在后端向前端传递的时候会将数据序列化,转为json,这时会出现循环引用造成堆栈溢出
解决方案:
解决方法就是在转换json时忽略循环字段。首先确定项目使用的json包是哪一个(jackjson 或 fastjson),寻找相应的注解忽略某一字段。
jackson包对应的相关注解: @JsonIgnoreProperties
、@JsonIgnore
之前关于这两个注解,是用在JSON循环引用的情况上,那么现在关于这两个注解,还可以使用在另外一种情况上
即:
一般标记在属性或者方法上,返回的json数据即不包含该属性
关于这种情况在什么时候会遇到呢?
例如:
User实体中会有字段password字段,当返回用户信息给前台的时候,当然是不希望将password值也一并返回,
所以,可以在password属性上加上注解JsonIgnore
或者,可以在User类上加上注解@JsonIgnoreProperties(value = "{password}")
都可以在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
fastjson包对应的相关注解: @JSONField(serialize = false)
// 我的项目使用的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;
}
注意: 在使用注解时一定要注意引入的包是否正确,如果和自己使用的json包不对应的话,注解是不生效的。