我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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”) 就可以了

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

VUEdivclick无效的问题及解决

这篇文章主要介绍了VUEdivclick无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

Mysql连接无效(invalidconnection)问题及解决

这篇文章主要介绍了Mysql连接无效(invalidconnection)问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-16

PyTorch加载模型model.load_state_dict()问题及解决

这篇文章主要介绍了PyTorch加载模型model.load_state_dict()问题及解决,具有很好的参考价值,希望对大家有所帮助。
2023-02-03

怎么解决php无法加载memcache问题

这篇文章主要讲解了“怎么解决php无法加载memcache问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决php无法加载memcache问题”吧!php无法加载memcache的解
2023-06-20

vue异步组件与组件懒加载问题怎么解决

本篇内容主要讲解“vue异步组件与组件懒加载问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue异步组件与组件懒加载问题怎么解决”吧!vue异步组件与组件懒加载在写项目的时候,需要动
2023-06-29

分析和解决IIS无法加载CSS的问题

IIS 是一种常用的 Web 服务器软件,它能够处理和响应客户端的请求,并向客户端发送网页文件和其他静态资源。在 Web 开发中,CSS(层叠样式表)是一个非常重要的组成部分,它用于定义网页的样式、布局和外观。然而,有时候使用 IIS 时,可能会遇到无法加载 CSS 文件的问题。在本篇文章中,我们将分析 IIS 无法加载 CSS 的原因并提供相应的解决方案。1. 服务器配置问题
2023-05-14

ThinPHP无法加载模块问题的解决方案

ThinPHP无法加载模块可能是因模块未安装、路径不正确、权限错误或PHP配置等原因造成的。解决方法包括检查模块安装、验证模块路径、调整文件权限、检查PHP配置、启用调试、清除缓存、重启服务器、查看日志文件、安装调试包,以及寻求社区支持。
ThinPHP无法加载模块问题的解决方案
2024-04-02

Mysql连接无效(invalid connection)问题及解决

目录mysql连接无效invalid connection解决的方案Mysql远程连接不生效总结Mysql连接无效invalid connection一般连接数据库的代码库都有实现连接池,如golang语言database/sql库,其中
2023-02-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录