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);
}
}