资讯专栏INFORMATION COLUMN

JPA 一对多双向映射 结果对象相互迭代 造成堆栈溢出问题方法

diabloneo / 3211人阅读

摘要:问题在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出。分析在后端向前端传递的时候会将数据序列化,转为,这时会出现循环引用造成堆栈溢出解决方案解决方法就是在转换时忽略循环字段。

问题:

JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError)。

分析:

在后端向前端传递的时候会将数据序列化,转为json,这时会出现循环引用造成堆栈溢出

解决方案:

解决方法就是在转换json时忽略循环字段。首先确定项目使用的json包是哪一个(jackjson 或 fastjson),寻找相应的注解忽略某一字段。

jackson包对应的相关注解: @JsonIgnoreProperties@JsonIgnore

fastjson包对应的相关注解: @JSONField(serialize = false)

注意: 在使用注解时一定要注意引入的包是否正确,如果和自己使用的json包不对应的话,注解是不生效的。

附代码:
// 我的项目使用的alibaba的fastjson包

@Data
class SOStudent {
    
    
    // ... ...省略其他字段
        
    @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinColumn(name="classId")
    @JSONField(serialize = false)
    private SOClass class;
}

@Data
class SOClass {
    @Id
    @GeneratedValue
    private Long id
        
    // ... ...省略其他字段
        
    @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER)
    private List students;
}


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73315.html

相关文章

  • JPA关系映射

    摘要:关系映射四种映射关系在关系数据库中有表与表存在下面几种关系多对一关系一对一关系一对多关系多对多关系也对应这中四种映射关系单值串联从一个实体实例关联到另一个实体实例上其中目标基数为成为单值关联多对一关系和一对一关系都是属于这 JPA关系映射 四种映射关系 在关系数据库中, 有表与表存在下面几种关系 多对一关系(Many-to-One) 一对一关系(One-to-One) 一对多关系(O...

    Faremax 评论0 收藏0
  • js面试题(下)

    摘要:短路运算返回值是什么又称为短路或,短路如果左侧为真,则不再进行右侧运算,同时返回左侧表达式运算结果。上面是不存在的,所有结果为,转成就是,那么就会运算,把赋值给的同时,返回值也是,所以打印返回结果是函数内部变量有哪些 DOM元素e的e.getAttribute(propName)和e.propName有什么区别和联系 e.getAttribute(),是标准DOM操作文档元素属性的方...

    zhoutao 评论0 收藏0
  • Spring Boot QuickStart (5) - Spring Data JPA

    摘要:关联关系的关联关系定义上,感觉并不是很灵活,姿势也比较难找。如,定义在关联关系上的参数可以设置级联的相关东西。因为序列化会涉及到实体类关联对象的获取,会触发所有的关联关系。 接(4) - Database 系列. Java Persistence API,可以理解就是 Java 一个持久化标准或规范,Spring Data JPA 是对它的实现。并且提供多个 JPA 厂商适配,如 Hi...

    sutaking 评论0 收藏0
  • 慕课网_《Hibernate注解》学习总结

    摘要:时间年月日星期二说明本文部分内容均来自慕课网。文件如下在目录下,创建文件指定映射文件的路径注解映射实体类可选,对应数据库中的一个表。 时间:2017年07月11日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:类级别注解 1-1 本章简介 本章简介 H...

    Jaden 评论0 收藏0
  • 超实用百道Java面试题

    摘要:是的简称,运行环境,为的运行提供了所需的环境。分割字符串,返回分割后的字符串数组。当计算的值相同时,我们称之为冲突,的做法是用链表和红黑树存储相同的值的。迭代器取代了集合框架中的,迭代器允许调用者在迭代过程中移除元素。 Java基础1.JDK和JRE有什么区别? JDK 是java development kit的简称,java开发工具包,提供java的开发环境和运行环境。JRE 是j...

    MkkHou 评论0 收藏0

发表评论

0条评论

diabloneo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<