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;

 

posted @ 2024-04-22 10:32  sensen~||^_^|||&  阅读(2)  评论(0编辑  收藏  举报