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

 更新时间:2021年10月15日 12:00  点击:2147

JPA @OneToMany及懒加载无效

@OneToOne @ManyToMany使用不做过多解释,重点解决“懒加载无效问题”。

示例:

@OneToMany

teacher 和 student是一对多关系

teacher表结构 student表结构

Teacher实体类

只需要在studentList上使用@OneToMany注解,对应的参数为 懒加载、级联操作、子表外键

Student实体类

在这里插入图片描述

我为了验证懒加载是否生效,在debug模式下发现懒加载并没有生效。在正常模式下,返回到页面也是有studentList的数据。于是开始排坑,逐渐怀疑人生。。

直到看到了某国际友人说的这么一句话。

It seems to be a debugging artifact.

At debugging time, because the transaction is still open, the watched lazy loaded entity properties will be loaded at the breakpoint evaluation time.

于是在application.properties中加上spring.jpa.show-sql=true,打开执行的SQL。

debug下,执行到29行,共执行了以下两句SQL:

Hibernate: select teacher0_.id as id1_1_0_, teacher0_.age as age2_1_0_, teacher0_.name as name3_1_0_ from teacher teacher0_ where teacher0_.id=?
Hibernate: select studentlis0_.teacher_id as teacher_4_0_0_, studentlis0_.id as id1_0_0_, studentlis0_.id as id1_0_1_, studentlis0_.addr as addr2_0_1_, studentlis0_.name as name3_0_1_, studentlis0_.teacher_id as teacher_4_0_1_ from student studentlis0_ where studentlis0_.teacher_id=?

开始只查询了teacher表,紧接着进行了关联查询,结合上面那句话猜测可能是debug导致的。而在正常模式下启动,也是两条SQL,猜测可能是返回前端时,序列化自动调用了getStudentList()方法,导致执行了第二条SQL。

于是新建TeacherDto.class

在这里插入图片描述

并在controller中return teacherDto,不直接返回teacher。

在这里插入图片描述

在正常模式下启动,果然只有一条SQL,没有进行级联查询。

Hibernate: select teacher0_.id as id1_1_0_, teacher0_.age as age2_1_0_, teacher0_.name as name3_1_0_ from teacher teacher0_ where teacher0_.id=?

至此踩坑结束……

小结一下吧

在使用@OneToOne、@OneToMany、@ManyToMany时,只需要加上参数fetch = FetchType.LAZY即可。

在debug模式下,会自动进行级联查询,导致懒加载无效,可能是idea方便开发人员调试,故意这样设置的。

在接口返回时,避免直接返回entity,可返回Dto或Vo。

实现JPA的懒加载和无外键

在网上找了很多jpa的懒加载,要不就是抓取策略,要不就随便加个fetch=FetchType.LAZY

其实jpa实现懒加载非常简单,其实和mybatis是一样的,就是不要调用对应属性的get方法就可以了

例如

很多接口输出对象时都会用 BeanUtils.copyProperties()将实体转为dto输出,这时候使用它的重载方法copyProperties(Object source, Object target, String… ignoreProperties)就可以实现懒加载了

代码如下

public class NoticeRecord {
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "noticeId",foreignKey = @ForeignKey(name = "null"))
    private List<NoticeSendeeRecord> noticeSendeeRecords;
}

转换时使用

这个重载方法的作用就是转换是忽略noticeRecord中noticeSendeeRecords属性

BeanUtils.copyProperties(noticeRecord,noticeRecordDTO,"noticeSendeeRecords");

这样就实现jpa的懒加载了,检查输出sql语句,也只有查询NoticeRecord 的语句,没有查询NoticeSendeeRecord的语句

而不让jpa产生外键使用 foreignKey = @ForeignKey(name = “null”) 就可以了

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

[!--infotagslink--]

相关文章

  • Angular性能优化之第三方组件和懒加载技术

    这篇文章主要介绍了Angular性能优化之第三方组件和懒加载技术,对性能优化感兴趣的同学,可以参考下...2021-05-11
  • Spring Data JPA 关键字Exists的用法说明

    这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • vue-router懒加载的3种方式汇总

    这篇文章主要给大家介绍了关于vue-router懒加载的3种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-28
  • Spring JPA配置文件Eclipse报错如何解决

    这篇文章主要介绍了Spring JPA配置文件Eclipse报错如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-21
  • 基于element-ui封装可搜索的懒加载tree组件的实现

    这篇文章主要介绍了基于element-ui封装可搜索的懒加载tree组件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-23
  • springdata jpa使用Example快速实现动态查询功能

    这篇文章主要介绍了springdata jpa使用Example快速实现动态查询功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    这篇文章主要介绍了解决Spring Data Jpa 实体类自动创建数据库表失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-12
  • vue实现路由懒加载的3种方法示例

    这篇文章主要给大家介绍了关于vue实现路由懒加载的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02
  • SpringBoot2 Jpa 批量删除功能的实现

    这篇文章主要介绍了SpringBoot2 Jpa 批量删除功能的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
  • JPA使用乐观锁应对高并发方式

    这篇文章主要介绍了JPA使用乐观锁应对高并发方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
  • Springboot使用Spring Data JPA实现数据库操作

    Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作...2021-06-30
  • SpringCloud的JPA连接PostgreSql的教程

    这篇文章主要介绍了SpringCloud的JPA接入PostgreSql 教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-06-26
  • js 图片懒加载的实现

    这篇文章主要介绍了js 图片懒加载的实现,帮助大家更好的优化自身网页,提高网页响应速度,感兴趣的朋友可以了解下...2020-10-21
  • javascript瀑布流式图片懒加载实例解析与优化

    这篇文章主要针对javascript瀑布流式图片懒加载实例进行解析与优化,感兴趣的小伙伴们可以参考一下...2016-02-26
  • 解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题

    这篇文章主要介绍了解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-05
  • 解决JPA @OneToMany及懒加载无效的问题

    这篇文章主要介绍了解决JPA @OneToMany及懒加载无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
  • 前端必会的图片懒加载(三种方式)

    在我们访问一个图片展示比较多的网页时,加载速度慢很多时候正是因为图片多导致,本文主要介绍了前端必会的图片懒加载(三种方式),具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-25
  • Spring Boot JPA Repository之existsBy查询方法失效的解决

    这篇文章主要介绍了Spring Boot JPA Repository之existsBy查询方法失效的解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10
  • Android之Viewpager+Fragment实现懒加载示例

    本文介绍了Android之Viewpager+Fragment实现懒加载示例的教程,非常实用,有兴趣的同学快来看看吧 我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他...2017-07-06