当前位置: 首页 > 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后端实习经验
  • 深入了解以太坊
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular2开发踩坑系列-生产环境编译
  • CentOS从零开始部署Nodejs项目
  • ECMAScript入门(七)--Module语法
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • PHP的Ev教程三(Periodic watcher)
  • vue-cli在webpack的配置文件探究
  • 仿天猫超市收藏抛物线动画工具库
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 区块链技术特点之去中心化特性
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何优雅地使用 Sublime Text
  • 使用 Docker 部署 Spring Boot项目
  • 使用parted解决大于2T的磁盘分区
  • 如何在招聘中考核.NET架构师
  • #if #elif #endif
  • #include
  • #php的pecl工具#
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Note)C++中的继承方式
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)大型网站的系统架构
  • **PHP二维数组遍历时同时赋值
  • .NET命令行(CLI)常用命令
  • .NET命名规范和开发约定
  • .py文件应该怎样打开?
  • ?
  • @Data注解的作用
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [100天算法】-目标和(day 79)
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C# 基础知识系列]专题十六:Linq介绍