JPA使用问题总结记录
1.jpa使用 @OneToMany 和 @ManyToOne注解映射两个实体类的关系时报栈溢出的错误:
> 实体代码片段:主表一条数据对应关联表多条数据,即主表中一条数据对应关联表中的多条crewmember数据,而关联表中对应一条主表的crewmanagement数据。
① 主表(一的一方)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "crewManagement", cascade = CascadeType.REMOVE)
private List<CrewMember> crewMemberList;
②关联表 (多的一方)
@ManyToOne
@JoinColumn(name = "s_crew_management_id")
private CrewManagement crewManagement;
> 控制台报错信息:
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844...
org.hibernate.collection.internal.PersistentBag[0]->...
> 分析:
该错误是在Controller返回JSON数据到前端的时候 出现了这个StackOverflowError的错误即 在将对象转换为JSON格式的数据的时候出现了无限递归调用的情况。
> 原因:
实体类之间互相关联 在序列化A实体类的时候 由于A里有B类 然后去序列化B 在序列化B实体类的时候 又由于B里有A类 然后去序列化A如此反复递归 从而造成该问题。
> 解决:
在有关联关系的属性的getter方法(请注意 是getter方法不是setter方法)上添加@JsonBackReference或@JsonManagedReference注解:
在多的一方加上@JsonBackReference注解并且在一的一方加上@JsonManagedReference注解。
这两个注解通常是配对使用的:@JsonBackReference注解标注的属性在序列化(serialization)的时候会被忽略 即结果中的json数据不包含该属性的内容而@JsonManagedReference注解标注的属性则会被序列化。
该注解也可以写在属性上:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "crewManagement", cascade = CascadeType.REMOVE)
@JsonManagedReference
private List<CrewMember> crewMemberList;
@ManyToOne
@JsonBackReference
@JoinColumn(name = "s_crew_management_id")
private CrewManagement crewManagement;