使用jpa的实体对象转json符串时懒加载的问题及解决

 更新时间:2022年02月23日 09:23:12   作者:weixin_49091968  
这篇文章主要介绍了使用jpa的实体对象转json符串时懒加载的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

解决转json符串时懒加载问题方法(1)

1.导入hibernate5转json的Maven依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.4</version>
</dependency>

2.配置MappingJackson2HttpMessageConverter对象:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    Hibernate5Module module = new Hibernate5Module();
    module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
    module.enable(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS);
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = converter.getObjectMapper();
    mapper.registerModule(module);
        return converter;
}

3.在实体类中使用@JsonIgnore加关联属性上,在序列化时忽略掉该属性即可:

@OneToMany
@JoinColumn(name = "fk_uid")
@JsonIgnore
private Set<Comment> comments;

解决转json符串时懒加载问题方法(2)

1.配置MappingJackson2HttpMessageConverter对象:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = converter.getObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
    return converter;
}

2.在实体类中使用@JsonIgnore加关联属性上,在序列化时忽略掉该属性即可:

@OneToMany
@JoinColumn(name = "fk_uid")
@JsonIgnore
private Set<Comment> comments;

Rest风格中关于JPA使用懒加载的坑

公司最近使用的ORM框架是JPA实现产品使用的是hibernate,曾经看过一篇博客上面说的是如果团队里面没有一个精通hibernate的人,那么最好不要使用它,我现在是深刻的体会到了。但是使用什么框架不是我能决定的,如果是我的话,我宁愿使用mybatis。吐槽完来讲讲出现的问题,因为我们项目是一个电商的项目模块比较多,所以各种表关联。

用了一段时间以后,我们发现非常的慢,打开一个页面要20多秒==!,后台一直打印sql,我们在实体上面注解的LAZY看似并没有起什么作用。各种调试各种百度但是一直找不到原因。

后面今天实现受不了了。我静下来仔细分析了一下,各种调试以后,我突然意识到,我们的项目和一起拿的项目不一样的地方在于现在这个项目全部是使用rest风格的。

而以往只要使用了懒加载那么页面上使用到了,才会查询,因为是使用到了jsp模板,是动态的编译的,说白一点就是其实jsp就是JAVA代码。但是我们的不一样,我们的将资源全部进行序列化操作,然后通过json将数据给传输到客户端,那么在序列化的时候,就会将所有的实体给进行序列化。

大概知道原因了以后,我的做法就是在返回的时候,动态的指定哪一些实体不需要序列化,对于那种互相关联的也忽略一边。再进行一遍操作的时候,果然不会那么慢了,最多一秒就出来了。我觉得这个坑还是必须注意一下的,不过我觉得还是没有一个精通hibernate的人的原因。

这个就当自己的一个总结吧,我觉得,对于技术选型一定要考虑具体情况,并不是好别人觉得好用就选什么。最后说一句,团队没有hibernate大神,还是少用,会被坑的要死要死的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Struts1简介和入门_动力节点Java学院整理

    Struts1简介和入门_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Struts1简介和入门的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Activiti7通过代码动态生成工作流实现详解

    Activiti7通过代码动态生成工作流实现详解

    这篇文章主要为大家介绍了Activiti7通过代码动态生成工作流实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 浅析mybatis和spring整合的实现过程

    浅析mybatis和spring整合的实现过程

    据官方的说法,在Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求,下面通过Mybatis-Spring来整合Mybatis跟Spring的用法做介绍
    2015-10-10
  • Java实现贪吃蛇大作战小游戏(附源码)

    Java实现贪吃蛇大作战小游戏(附源码)

    今天给大家带来的是小项目是 基于Java+Swing+IO流实现 的贪吃蛇大作战小游戏。实现了界面可视化、基本的吃食物功能、死亡功能、移动功能、积分功能,并额外实现了主动加速和鼓励机制,需要的可以参考一下
    2022-07-07
  • Java设计模式之迭代器模式_动力节点Java学院整理

    Java设计模式之迭代器模式_动力节点Java学院整理

    这篇文章主要介绍了Java设计模式之迭代器模式_动力节点Java学院整理,需要的朋友可以参考下
    2017-08-08
  • MyBatis 如何简化的 JDBC(思路详解)

    MyBatis 如何简化的 JDBC(思路详解)

    MyBatis 是一个 持久层 框架,用于 简化JDBC开发,这篇文章主要介绍了MyBatis 如何简化的 JDBC(思路详解),需要的朋友可以参考下
    2023-03-03
  • java实现JSON字符串格式化输出

    java实现JSON字符串格式化输出

    这篇文章主要为大家详细介绍了如何使用java实现JSON字符串格式化输出,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2024-01-01
  • Java中FilterInputStream和FilterOutputStream的用法详解

    Java中FilterInputStream和FilterOutputStream的用法详解

    这篇文章主要介绍了Java中FilterInputStream和FilterOutputStream的用法详解,这两个类分别用于封装输入和输出流,需要的朋友可以参考下
    2016-06-06
  • Java实现五子棋游戏

    Java实现五子棋游戏

    这篇文章主要为大家详细介绍了Java实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • SpringBoot任务之详解邮件任务

    SpringBoot任务之详解邮件任务

    今天给大家整理的文章是SpringBoot邮件任务的相关知识点,文中有非常详细的介绍及代码示例,对正在学习SpringBoot任务的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06

最新评论