将多个文件发布到数据库 - 多对一关系的空值
Posted
技术标签:
【中文标题】将多个文件发布到数据库 - 多对一关系的空值【英文标题】:Posting multiple files to Database - Null value for ManyToOne relationship 【发布时间】:2020-11-09 02:59:39 【问题描述】:我有两个具有 onetomany 和 manytoone 关系的实体,如下所示:
@Entity
@Table(name="file_model")
public class FileModel
....
@JoinColumn(name = "userid", referencedColumnName = "id")
@ManyToOne(optional = false)
private AppUser appUser;
....
@Entity
@Table(name="app_user")
public class FileModel
....
@OneToMany(cascade = CascadeType.ALL, mappedBy = "appUser")
private Set<FileModel> appUserFiles;
....
我正在尝试使用 SpringBoot Data/JPA 将多个文件发布到数据库。我的控制器中有以下内容。同时我正在尝试为每个要保存的文件设置用户 ID。
@RequestMapping(value = "/addDocument/id" , method = RequestMethod.POST)
public String uploadDocument(@RequestParam("files") MultipartFile[] files, @PathVariable Long id, ModelMap model)
throws IOException
List<String> fileNames = new ArrayList<String>();
AppUser appUser = appUserRepository.findById(id).get();
System.out.println("User ID is :: " + appUser.getId());
System.out.println("User EMail is :: " + appUser.getUseremail());
try
List<FileModel> storedFile = new ArrayList<FileModel>();
for (MultipartFile file : files)
FileModel fileModel = new FileModel();
fileModel.setAppUser(appUser);
fileModel = new FileModel(file.getOriginalFilename(), file.getContentType(), file.getBytes());
fileNames.add(file.getOriginalFilename());
storedFile.add(fileModel);
fileRepository.saveAll(storedFile);
model.addAttribute("message", "All files uploaded successfully!");
model.addAttribute("files", fileNames);
catch (Exception e)
model.addAttribute("message", "ERROR. File Upload Failed !!");
model.addAttribute("files", fileNames);
e.printStackTrace();
return "redirect:/addDocument/" + id;
这是我在控制台得到的:
User ID is :: 1
User EMail is :: user1@mydomain.com
2020-07-19 16:37:43.951 WARN 39179 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23502, SQLState: 23502
2020-07-19 16:37:43.952 ERROR 39179 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : NULL not allowed for column "USERID"; SQL statement:
insert into file_model (created_at, updated_at, userid, mimetype, name, pic, id) values (?, ?, ?, ?, ?, ?, ?) [23502-200]
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
现在,既然我的 AppUser 对象已成功创建(从 id 和 email-id 的 sysout 值可以看出),为什么我会收到此异常?我在这里缺少什么?
【问题讨论】:
嘿,有点混乱。您的第二个实体名称真的是 FileModel 吗?即使表名不同? 【参考方案1】:您确实编写了以下代码:
for (MultipartFile file : files)
FileModel fileModel = new FileModel();
fileModel.setAppUser(appUser);
fileModel = new FileModel(file.getOriginalFilename(), file.getContentType(), file.getBytes());
fileNames.add(file.getOriginalFilename());
storedFile.add(fileModel);
但问题是,首先您将 fileModel 设置为 new FileModel() 和两行之后,您再次这样做,因此 fileModel.setAppUser(appUser) 行是没有意义的。 就这样吧,它应该可以工作:
final FileModel fileModel = new FileModel(file.getOriginalFilename(), file.getContentType(), file.getBytes());
fileModel.setAppUser(appUser);
fileNames.add(file.getOriginalFilename());
storedFile.add(fileModel);
也尽量使用“final”。特别是在这种情况下,如果您使用“final”,您会意识到您正在覆盖您的对象。
最好的问候
【讨论】:
我犯了一个多么愚蠢的错误。无法消化-我怎么会错过。!非常感谢你的帮助。它现在可以工作了。以上是关于将多个文件发布到数据库 - 多对一关系的空值的主要内容,如果未能解决你的问题,请参考以下文章