使用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大神,还是少用,会被坑的要死要死的。

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

(0)

相关推荐

  • 解决JPA @OneToMany及懒加载无效的问题

    目录 JPA @OneToMany及懒加载无效 @OneToMany 小结一下吧 实现JPA的懒加载和无外键 例如 转换时使用 JPA @OneToMany及懒加载无效 @OneToOne @ManyToMany使用不做过多解释,重点解决"懒加载无效问题". 示例: @OneToMany teacher 和 student是一对多关系 只需要在studentList上使用@OneToMany注解,对应的参数为 懒加载.级联操作.子表外键 我为了验证懒加载是否生效,在debug模式下发现

  • SpringBoot2 JPA解决懒加载异常的问题

    jpa解决懒加载异常 在我上一遍文章上进行行修改,SpringBoot2 实现JPA分页和排序分页 实体类上改: @Entity @Table(name = "employee") @JsonIgnoreProperties(value={"hibernateLazyInitializer", "department"}) public class Employee { @Id @GeneratedValue(strategy = Generat

  • Jpa 如何使用@EntityListeners 实现实体对象的自动赋值

    1.简介 1.1 @EntityListeners 官方解释:可以使用生命周期注解指定实体中的方法,这些方法在指定的生命周期事件发生时执行相应的业务逻辑. 简单来说,就是监听实体对象的增删改查操作,并对实体对象进行相应的处理. 1.2 生命周期对应注解 JPA一共提供了7种注解,分别是: @PostLoad :实体对象查询之后 @PrePersist : 实体对象保存之前 @PostPersist :实体对象保存之后 @PreUpdate :实体对象修改之前 @PostUpdate :实体对象修

  • 使用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</a

  • JPA @Basic单表查询如何实现大字段懒加载

    JPA @Basic单表查询实现大字段懒加载 近期看了JPA@Basic注解的使用,看到该注解可以设置字段的懒加载. 1.以前碰到的懒加载: 我们知道,多表关联的时候,我们是可以配置懒加载的,比如一个Company类,里面可以关联员工表,办公设备表,当我们查看公司信息的时候,我们并不需要直接加载员工表,办公设备表,只需要在用户查看员工,查看设备的时候再加载,这样可以提高加载效率. 长话短说,大概是这样子的 @Entity @Table(name = "Company") public

  • Spring集成JPA配置懒加载报错解决方案

    一:报错no session 因为entitymanager对象在事物提交后就关闭了 报错的 no session相当于sql的session 解决办法:解决办法 在web.xmL配置一个过滤器 使其在这个session中的manager在结束后再关闭open <!--配置openmanager--> <filter> <filter-name>openEntity</filter-name> <filter-class>org.springfr

  • Struts2在打包json格式的懒加载异常问题

    Hibernate中如果出现了级联查询,就可能出现懒加载问题,比如我现在有个Account(管理员)类.Category(商品类别)和Product(商品)类,从左到右都是一对多的关系,而且从右到左都是设置了@ManyToOne(fetch=FetchType.LAZY).我现在要把商品信息查出来打包成json格式传到前台,我在后台使用查询语句为: from Product p left join fetch p.category where p.name like:name  这样就可以把Pr

  • SpringBoot JPA懒加载失效的解决方案(亲测有效)

    SpringBoot JPA懒加载失效 使用springBoot JPA 对两个实体类进行双向关联,并设置了懒加载,如下: 然后在查询后用到了roles,会报错, 解决办法如下: 1. 在配置文件中加入: spring.jpa.properties.hibernate.enable_lazy_load_no_trans =true 2. 如果你是在SpringBoot的测试类 中使用报错,则在方法上加入@Transactional注解 在百度查询时发现有人说 修改该配置: spring.jpa.

  • 利用Dojo和JSON建立无限级AJAX动态加载的功能模块树

    看了"使用hibernate实现树形结构无限级分类"这篇文章后,我也想将自己在所有开发的项目中使用的功能模块树的实现方法以及完整DEMO(含源码)贴出来和大家分享.其实在我的博客里是老早贴出来的,由于时间关系没好好整理.        功能模块树是几乎在每个项目里都要用到的东西,利用Dojo的好处就是可以实现树的子节点的动态加载,这在树节点很多的情况下是很有用的.         下载附件二dojotree.rar,解压后将dist\dojotree.war部署到应用服务器即可浏览DE

  • Kotlin对象的懒加载方式by lazy 与 lateinit 异同详解

    目录 前言 lateinit by lazy 总结 前言 属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现. 他们两者都是延时初始化,那么在使用时那么他们两者有什么区别呢? lateinit 见名知意,延时初始化的标记.lateinit var可以让我们声明一个变量并且不用马上初始化,在我们需要的时候进行手动初始化即可. 如果我们不初始化会怎样? private lateinit var name: String findViewById<Bu

  • js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)

    看个例子: 复制代码 代码如下: <input type="button" name="" value="载入图片" onclick="addImg('tt.jpg')" /> <script type="text/javascript"> <!-- function addImg(isrc) { var Img = new Image(); Img.src = isrc; I

随机推荐