当前位置: 首页 > news >正文

JPA外键映射注解导致的性能问题

在项目中遇到了Ajax调用后端方法时反应过慢的问题。到了后端查看接口,发现是使用实体类进行直接查询,接口走完之后控制台又打出了很多sql,说明在执行完当前接口后,程序还未结束,又在继续执行其他的操作。于是想到接口完成后执行的部分才是真正影响性能的地方,仔细查看了一下数据库表结构,发现该表存在外键关联,查看实体类后,在实体类中发现了如下注解

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public Set<Location> getLocations() {return this.Locations;}

此注解是用来做外键关联的,表示一个实体可以拥有多个其他实体的实例,用来处理数据库中一对多的关系,他存在几个属性

cascade属性:(1)不定义,则对关系表不会产生任何影响(2CascadeType.PERSIST 级联新建(3CascadeType.REMOVE 级联删除(4CascadeType.REFRESH 级联刷新(5CascadeType.MERGE 级联更新(6CascadeType.ALL 表示同时选择上面四种fetch属性:
定义关联属性何时进行加载:(1FetchType.EAGER:表示关系类在主类加载的时候同时加载(2FetchType.LAZY:表示关系类在被访问时才加载,默认值是 FetchType.LAZYmappedBy属性:(1)拥有关联关系的字段,如果关系是单向的就不需要;如果是双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力;而另一方没有这种能力,只能被动管理;这个属性被定义在关系的被拥有方。支持双向 @OneToOne,双向 @OneToMany,双向 @ManyToMany。orphanRemoval属性:(1)指定在删除一方(One)数据的同时是否删除掉多方(Many)的数据。默认为 false,不删除多方(Many)数据;仅仅将一方(One)和连接表的数据进行删除。例如:一个主记录包含三条副记录targetEntity属性:(1)关联目标的实体类,一般不需要写,JPA可以自动识别

于是根据上面的注解属性我们得知了问题根本原因,由于我使用的是JPA的实体类查询方法,会直接通过某些条件获取实体类所有字段,相当于sql中的select *,而此处使用了cascadeType.ALL和fetchType.EAGER,表示在加载实体类时同时将其关联的所有实体加载出来,由于该表外键所关联的信息极多且泛型里字段也多,因此在加载外键关联的时候浪费了大量的时间(前端并不需要关联的实体类),造成了性能问题。
解决方法可以使用sql直接查询固定字段返回到前端,这样不涉及到外键关联字段的查询也就不会触发注解的加载。还有就是将fetch的属性修改为FetchType.LAZY,表示在需要的时候才去加载,也就是你直接去访问的时候程序会自动去加载这些信息,而不是查询的时候不管需不需要直接将所有关联查询出来,这样自然耗费很多时间!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一款专为内网办公环境设计的操作系统,集成了Word、Excel、PPT、PDF编辑器,内网聊天、白板、思维导图等多款办公工具(附源码)
  • 网络通信粘包问题
  • 手机游玩植物大战僵尸杂交版V2.3.7最新版教程(文章末尾免费直接下载链接)
  • 【CAN总线测试】——CAN物理层测试
  • 尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)
  • C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发
  • 2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !
  • Otterctf 2018 内存取证 (复现)
  • Redis持久化RDB/AOF
  • linux和docker部署基本的命令掌握
  • 全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器
  • 《Web项目跨域请求后端Api设置Cookie失败问题?》
  • 前端如何快速切换node版本:nvm
  • 1.反爬虫机制
  • 一、Java入门知识与基本使用
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • Angular4 模板式表单用法以及验证
  • CSS居中完全指南——构建CSS居中决策树
  • Django 博客开发教程 8 - 博客文章详情页
  • Js基础知识(四) - js运行原理与机制
  • TypeScript迭代器
  • 从0实现一个tiny react(三)生命周期
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用Gradle第一次构建Java程序
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 写给高年级小学生看的《Bash 指南》
  • 学习使用ExpressJS 4.0中的新Router
  • 一天一个设计模式之JS实现——适配器模式
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​如何在iOS手机上查看应用日志
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #HarmonyOS:Web组件的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)pulsar安装在独立的docker中,python测试
  • (一)VirtualBox安装增强功能
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net中的集合
  • @SentinelResource详解
  • [001-03-007].第07节:Redis中的事务
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [20181219]script使用小技巧.txt
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [4.9福建四校联考]
  • [51nod1610]路径计数