使用jpa的实体对象转json符串时懒加载的问题及解决
目录
- 解决转json符串时懒加载问题方法(1)
- 解决转json符串时懒加载问题方法(2)
- Rest风格中关于JPA使用懒加载的坑
解决转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大神,还是少用,会被坑的要死要死的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。