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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享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接口传值