SpringDataJpa大坑——一对多级联修改问题

news/2024/4/27 13:32:34

前言

寒假接手一个项目,甲方提出了这样一个功能——需要一个商品有多张图片。可以进行滑动观看。这个需求很简单,前端只要做一个轮播图,后端只要涉及一个商品下有多组照片即可(一对多关系)。

项目后端选型

框架springboot 数据库框架springDataJpa
想要了解什么springDataJpa,可以看这篇文章

bug重现

甲方在后台图片进行图片拖动改变位置,点击进行修改按钮,该商品拖动改变位置的图片依旧没有发生变化。根据排查,前端发过来请求参数,确实改变了图片的位置。因此只能是后端背锅啦!
可以给大家看看之前我写的前一版的代码(update方法)

    @PostMapping("/updateModel")@ApiOperation(value = "更新型号", notes = "更新型号信息")public String updateModel(@RequestBody Model model) throws Exception {// 获取目标型号Model byModelId = modelService.findByModelId(model.getModelId());List<Image> targetImgs = byModelId.getImgs();if (byModelId == null) {throw new Exception("noModel");}if (targetImgs != null) {List<Image> imgs = model.getImgs();if(!CollectionUtils.isEmpty(imgs)) {List<String> url = imgs.stream().map(Image::getUrl).collect(Collectors.toList());for (Image image : model.getImgs()) {url.add(image.getUrl());imageService.addImage(image);}int waterMark = 1;// 改变了,要用原图进行添加水印,而不是用已经水印图进行再一次重复水印waterMark = createWaterMarkWithRaw(model.getModelName(), url);if (waterMark != 1) {throw new Exception("添加水印失败");}}}// 更新保存到数据库modelService.updateModel(model);return "success";}

我在网上苦苦搜寻,都是关于对多端实体进行注解的添加,而我这个项目的多端就是商品下多个图片List< Image > imgs

   @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphanRemoval = true)private List<Image> imgs;

cascade=CascadeType.ALL,orphanRemoval = true这两个说白了就是说进行级联操作,会对对应的子实体也会进行相应的改变(删除、插入等)
然后并没有什么卵用,我一直给干到一点中,弥留之际,我发现了问题的关键所在!

解决方案

因为jpa的机制,是可以通过注解@OneMany将实体创建表,也会创建关系表
在我这个项目就是Model 、Image和Model_img三张表。我在前面不断地测试插入,发现Model_img表没有发生改变,关联关系依旧是原来的“配对”。所以!说明咱们得update方法并没有进行修改Model_img表里所维护的数据。
那么我们只要手动干预model_img表中的关系数据,不就可以了吗。这样查出来就是修改后关系的数据了!
提交后的代码

    @PostMapping("/updateModel")@ApiOperation(value = "更新型号", notes = "更新型号信息")public String updateModel(@RequestBody Model model) throws Exception {// 获取目标型号Model byModelId = modelService.findByModelId(model.getModelId());if (byModelId == null) {throw new Exception("noModel");}List<Image> newImags = new ArrayList<>();List<Image> imgs = model.getImgs();if(!CollectionUtils.isEmpty(imgs)) {List<String> url = imgs.stream().map(Image::getUrl).collect(Collectors.toList());for (Image image : model.getImgs()) {url.add(image.getUrl());imageService.addImage(image);Image newImage = new Image();newImage.setUrl(image.getUrl());newImags.add(newImage);}int waterMark = 1;// 改变了,要用原图进行添加水印,而不是用已经水印图进行再一次重复水印waterMark = createWaterMarkWithRaw(model.getModelName(), url);if (waterMark != 1) {throw new Exception("添加水印失败");}}// 清理原先数据model.getImgs().clear();// 添加修改位置的图片数据model.getImgs().addAll(newImags);modelService.updateModel(model);return "success";}

ps:多端实体也是需要进行添加相应的注解!即

   @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphanRemoval = true)private List<Image> imgs;

到此,bug解决!时间终止为1点半!赚钱不易【叹气】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审

长安链智能合约标准协议 在智能合约编写过程中&#xff0c;不同的产品及开发人员对业务理解和编程习惯不同&#xff0c;即使同一业务所编写的合约在具体实现上也可能有很大差异&#xff0c;在运维或业务对接中面临较大的学习和理解成本&#xff0c;现有公链合约协议规范又不能完…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达&#xff0c;使软件工程师能够&#xff1a; &#xff08;1&#xff09;分析设计在满足所规定的需求方面的有效性 &#xff08;2&#xff09;在设计变更相对容易的阶段&#xff0c;…

Go 1.22 - 更加强大的 Go 执行跟踪

原文&#xff1a;Michael Knyszek - 2024.03.14 runtime/trace 包含了一款强大的工具&#xff0c;用于理解和排查 Go 程序。这个功能可以生成一段时间内每个 goroutine 的执行追踪。然后&#xff0c;你可以使用 go tool trace 命令&#xff08;或者优秀的开源工具 gotraceui&a…

使用Redis做缓存的小案例

如果不了解Redis&#xff0c;可以查看本人博客&#xff1a;Redis入门 Redis基于内存&#xff0c;因此查询速度快&#xff0c;常常可以用来作为缓存使用&#xff0c;缓存就是我们在内存中开辟一段区域来存储我们查询比较频繁的数据&#xff0c;这样&#xff0c;我们在下一次查询…

基于python+vue智慧社区家政服务系统的设计与实现flask-django-nodejs

论文主要是对智慧社区家政服务系统进行了介绍&#xff0c;包括研究的现状&#xff0c;还有涉及的开发背景&#xff0c;然后还对系统的设计目标进行了论述&#xff0c;还有系统的需求&#xff0c;以及整个的设计方案&#xff0c;对系统的设计以及实现&#xff0c;也都论述的比较…

公司内部局域网怎么适用飞书?

随着数字化办公的普及&#xff0c;企业对于内部沟通和文件传输的需求日益增长。飞书作为一款集成了即时通讯、云文档、日程管理、视频会议等多种功能的智能协作平台&#xff0c;已经成为许多企业提高工作效率的首选工具。本文将详细介绍如何在公司内部局域网中应用飞书&#xf…