JPA 一对多双向映射 结果对象相互迭代 造成堆栈溢出问题方法
问题:
JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError)。
分析:
在后端向前端传递的时候会将数据序列化,转为json,这时会出现循环引用造成堆栈溢出
解决方案:
解决方法就是在转换json时忽略循环字段。首先确定项目使用的json包是哪一个(jackjson 或 fastjson),寻找相应的注解忽略某一字段。
jackson包对应的相关注解: @JsonIgnoreProperties
、@JsonIgnore
fastjson包对应的相关注解: @JSONField(serialize = false)
注意: 在使用注解时一定要注意引入的包是否正确,如果和自己使用的json包不对应的话,注解是不生效的。
附代码:
// 我的项目使用的alibaba的fastjson包
@Data
class SOStudent {
<span class="token comment"><span class="hljs-comment">// ... ...省略其他字段</span></span>
<span class="token annotation punctuation"><span class="hljs-meta">@ManyToOne</span></span><span class="token punctuation">(</span>cascade <span class="token operator">=</span> <span class="token punctuation">{</span>CascadeType<span class="token punctuation">.</span>REFRESH<span class="token punctuation">}</span><span class="token punctuation">,</span> fetch <span class="token operator">=</span> FetchType<span class="token punctuation">.</span>LAZY<span class="token punctuation">)</span>
<span class="token annotation punctuation"><span class="hljs-meta">@JoinColumn</span></span><span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string"><span class="hljs-string">"classId"</span></span><span class="token punctuation">)</span>
<span class="token annotation punctuation"><span class="hljs-meta">@JSONField</span></span><span class="token punctuation">(</span>serialize <span class="token operator">=</span> <span class="token boolean"><span class="hljs-keyword">false</span></span><span class="token punctuation">)</span>
<span class="token keyword"><span class="hljs-keyword">private</span></span> SOClass <span class="token keyword"><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span class="token punctuation">;</span>
}
@Data
class SOClass {
@Id
@GeneratedValue
private Long id
<span class="token comment"><span class="hljs-comment">// ... ...省略其他字段</span></span>
<span class="token annotation punctuation"><span class="hljs-meta">@OneToMany</span></span><span class="token punctuation">(</span>cascade<span class="token operator">=</span><span class="token punctuation">{</span>CascadeType<span class="token punctuation">.</span>ALL<span class="token punctuation">}</span><span class="token punctuation">,</span>fetch <span class="token operator">=</span> FetchType<span class="token punctuation">.</span>EAGER<span class="token punctuation">)</span>
<span class="token keyword"><span class="hljs-keyword">private</span></span> List<span class="token generics function"><span class="token punctuation"><</span>SOStudent<span class="token punctuation">></span></span> students<span class="token punctuation">;</span>
}
原文地址:https://blog.csdn.net/stoneBridge1920/article/details/87774467
JPA 一对多双向映射 结果对象相互迭代 造成堆栈溢出问题方法的更多相关文章
- mybatis的一对多双向映射
连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类型”属性, ...
- mybatis一对多双向映射
连表查询 select id resultType resultMap resultType和resultMap不能同时使用 association 属性 映射到多对一中的“一”方的“复杂类 ...
- Spring Data Jpa一对多单向映射
/** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...
- Gson 转换hibernate级联对象出现StackOverFlow(堆栈溢出)问题
< many-to-one>和< one-to-many>属性的对象级联关系在转换时会造成死循环,报stackOverFlowException. 比如下面这段: @OneTo ...
- Hibernate从入门到精通(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...
- Hibernate(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...
- Mybatis框架中实现双向一对多关系映射
学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...
- 06章 映射一对多双向关联关系、以及cascade、inverse属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
- 映射一对多双向关联关系 cascade、inverse、属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
随机推荐
- arcgis信息窗口
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 存储过程调用http 服务
--sql 服务器设置 --启动 OLE Automation Proceduressp_configure 'show advanced options', 1; --此选项用来显示sp_con ...
- oracle 处理表的一列
---删除一列和数据一起删除了. ALTER TABLE 表名 DROP COLUMN 列名; ---添加一列 alert table 表名 add column 列名; ---只删除一列的数据 没有 ...
- day38 21-今天的内容总结
以前我们在web层里面去调Service再在Service里面去调DAO是一路new过去的,在web层里面new Service,然后在Service里面new DAO.每次你都需要主动去找这个对象. ...
- 在Eclipse中添加Tomcat
在Eclipse中开发web或开启web服务需要Tomcat的支持,在添加Tomcat之前要清楚你的Eclipse版本,如果你的Eclipse是javvEE版的就可以直接安装Tomcat,如果不是就需 ...
- 【JZOJ4771】【NOIP2016提高A组模拟9.9】爬山
题目描述 国家一级爬山运动员h10今天获得了一张有着密密麻麻标记的地图,在好奇心的驱使下,他又踏上了去爬山的路. 对于爬山,h10有一个原则,那就是不走回头路,于是他把地图上的所有边都标记成了有向边. ...
- django其他
聚合查询 聚合函数必须在分组之后使用 没有分组默认整体为一组 聚合函数 Max, Min, Sum, Avg, Count 从django.db.models 导入方法,然后使用关键字aggregat ...
- HDU4251-The Famous ICPC Team Again(划分树)
Problem Description When Mr. B, Mr. G and Mr. M were preparing for the 2012 ACM-ICPC World Final Con ...
- More Effective C++: 03异常
C++的异常机制使得程序付出某些代价:资源泄漏的可能性增加了:写出具有你希望的行为的构造函数与析构函数变得更加困难:执行程序和库程序尺寸增加了,同时运行速度降低了等等. 但是为什么使用异常呢?C程序使 ...
- Python学习之路15☞socket编程
一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...