将多个文件发布到数据库 - 多对一关系的空值

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”,您会意识到您正在覆盖您的对象。

最好的问候

【讨论】:

我犯了一个多么愚蠢的错误。无法消化-我怎么会错过。!非常感谢你的帮助。它现在可以工作了。

以上是关于将多个文件发布到数据库 - 多对一关系的空值的主要内容,如果未能解决你的问题,请参考以下文章

处理遗留数据库时在 NHibernate 中建模多对一关系的最佳方法?

一对多和多对一关系的区别

模板中具有多对一关系的Django模型

连接两个共享多对一关系的 SQL 表

针对多对一关系优化 SQL 查询

我需要使用具有多对一关系的@Access=FIELD 注释吗?