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 @   sensen~||^_^|||&  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2022-04-22 Java开发笔记12 (树的简单的增删改 & 树的生成 & 树的列表展示)
2022-04-22 Java 接口返回格式封装
2022-04-22 SpringBoot GetMapping和postMaping接口传值
点击右上角即可分享
微信分享提示