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

jpa在对主表更新的同时对关联表进行更新操作

jpa在对主表更新的同时对关联表进行更新操作

表介绍

有一会议表,它关联一个会议文件表,这个会议文件表的file_id来自于文件表的id。

会议表字段:

id 主键
title 会议标题
content 会议内容

会议文件关联表:

id 主键
metting_id 会议id
file_id 文件id

文件表:

id 主键
file_name 文件名
file_path 文件路径

业务介绍

在新增/更新会议的时候,我们可以上传文件(这里我们介绍的是更新)。

当前端上传文件时,会将文件名和路径写到数据库的文件表中,同时需要后端把该文件的id返回给前端。

接着我们在后端需要将会议这条记录先更新到数据库会议表中,再根据前端记录的文件的id列表和这条会议的id写入到数据库会议文件表中。

在新增会议文件表的记录之前,需要先删除之前这条会议的id所关联的原有的会议文件。

实体类

会议Meet.class

private Long id;
private String title;
private String content; 

会议文件MeetFile.class

private Long id;
// 关联的会议id
private Long meetId;
// 关联的文件id
private Long fileId;

文件File.class

private Long id;
private String fileName;
private String filePath;

同时我们定义一个dto,用于接收前端参数

MeetDto.class

private Long id;
private String title;
private String content;
private List<Long> fileIds;

Service层

当更新会议表的时候,同时更新它所关联的会议文件表。

MeetService代码:

/**
 * @Description: 修改接口
 * @Param dto 更新参数dto实体类
 */
@Transactional(rollbackFor = Exception.class)
public void updateDto(MeetDto dto) {
    Meet entity = new Meet();
    BeanUtils.copyProperties(dto, entity);

    this.update(entity);
    Long meetId = dto.getId();

    // 文件列表
    List<Long> fileIdList = dto.getFileIds();
    // 先删除数据库中原有数据再新增
    if (null != fileIdList) {
        List<MeetFile> list = meetFileService.queryAll(SearchFilter.build("meetId", meetId));
        meetFileService.deleteInBatch(list);
        saveFile(meetId, fileIdList);
    }
}

/**
 * @Description: 保存附件
 * @Param meetId 主键id
 * @Param fileIdList 附件id集合
 */
private void saveFile(Long meetId, List<Long> fileIdList) {
    if (fileIdList != null) {

        List<MeetFile> fileList = new ArrayList<>(fileIdList.size());
        fileIdList.forEach(id -> {
            MeetFile file = new MeetFile();
            file.setMeetId(meetId);
            file.setFileId(id);
            fileList.add(file);
        });
        meetFileService.saveAll(fileList);
    }
}

相关文章:

  • type: Object, default: 数组/对象的写法
  • 腾讯文档的表格设置行高
  • java order by 防止注入的方法
  • required a bean of type that could not be found. The injection point has the following annotations:
  • 删除换行符在线 在线删除所有回车换行工具
  • 实现将HashMap转换成为ArrayList,并将map的Key 、Value分别存放到两个ArrayList当中
  • java switch可以字符串吗
  • @Query中countQuery的介绍
  • java8 Stream将List转成Map
  • ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘xxx.sxxx_.id‘ which is
  • group by 和 where一起使用
  • java求多个Long的平均数,其中可能有null
  • java遍历Map的四种方法
  • win11窗口分1/3 2/3屏的方法
  • java后端实习经验
  • Babel配置的不完全指南
  • classpath对获取配置文件的影响
  • Javascript基础之Array数组API
  • jdbc就是这么简单
  • JWT究竟是什么呢?
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 初探 Vue 生命周期和钩子函数
  • 订阅Forge Viewer所有的事件
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 回顾2016
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 用mpvue开发微信小程序
  • 原生Ajax
  • ​虚拟化系列介绍(十)
  • #include<初见C语言之指针(5)>
  • #includecmath
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)理解angular中的module和injector,即依赖注入
  • (五)网络优化与超参数选择--九五小庞
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net各种迷惑命名解释
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @Resource和@Autowired的区别
  • @我的前任是个极品 微博分析
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [CDOJ 1343] 卿学姐失恋了
  • [codevs 1515]跳 【解题报告】
  • [docker] Docker的私有仓库部署——Harbor
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [iOS]-UIKit
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [javaSE] GUI(事件监听机制)
  • [LeetCode] 178. 分数排名