Spring Boot Hibernate多对一不保存joinColumn结果

Posted

技术标签:

【中文标题】Spring Boot Hibernate多对一不保存joinColumn结果【英文标题】:Spring Boot Hibernate Many To One not saving joinColumn result 【发布时间】:2022-01-07 07:02:36 【问题描述】:

我正在尝试使用 Spring boot 在 mysql 中存储图像,我有一个用户实体,我想在我的 FileUpload 实体之间创建多对一关系。

我在前端使用 react,此上传服务的目的是让用户可以设置自己的个人资料图片,但我首先希望正确地获取 User 和 FileUpload 实体之间的关系。

我遇到的问题是,当用户上传图像时,FileUpload 表中的 joinColumn 没有保存用户实体 ID。它只是在外键字段中返回一个空值。


文件上传.java


@Entity
@Table(name="file_upload")
public class FileUpload 

    @Id
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @GeneratedValue(generator = "uuid")
    private String id;

    private String name;

    private String type;

    @Lob
    private byte[] data;

    @ManyToOne
    @JoinColumn( name="user_id")
    private User user;

    public FileUpload() 

    

    public FileUpload(String name, String type, byte[] data) 
        this.name = name;
        this.type = type;
        this.data = data;
    

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getType() 
        return type;
    

    public void setType(String type) 
        this.type = type;
    

    public byte[] getData() 
        return data;
    

    public void setData(byte[] data) 
        this.data = data;
    

    public User getUser() 
        return user;
    

    public void setUser(User user) 
        this.user = user;
    



FileUploadService.java

我也有一个存储库,里面没有自定义方法。
@Service
public class FileUploadService 
    @Autowired
    private FileUploadRepository fileUploadRepository;

    public FileUpload store(MultipartFile file) throws IOException 
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        FileUpload fileDB = new FileUpload(fileName, file.getContentType(), file.getBytes());

        return fileUploadRepository.save(fileDB);
    

    public FileUpload getFile(String id) 
        return fileUploadRepository.findById(id).get();
    

    public Stream<FileUpload> getAllFiles() 
        return fileUploadRepository.findAll().stream();
    




FileUploadController.java


@Controller
@CrossOrigin()
public class FileUploadController 

    @Autowired
    private FileUploadService fileUploadService;

    @PostMapping("/upload")
    public ResponseEntity<?> uploadFile(@RequestParam("file")MultipartFile file) 
        String message = "";
        try 
            fileUploadService.store(file);

            message = "Uploaded the file successfully: " + file.getOriginalFilename();
            return ResponseEntity.status(HttpStatus.OK).body(new ApiResponse(true, message));
         catch (Exception e) 
            message = "Could not upload the file: " + file.getOriginalFilename() + "!";
            return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ApiResponse(true, message));
        
    


    @GetMapping("/files")
    public ResponseEntity<List<?>> getListFiles() 
        List<FileUploadResponse> files = fileUploadService.getAllFiles().map(dbFile -> 
            String fileDownloadUri = ServletUriComponentsBuilder
                    .fromCurrentContextPath()
                    .path("/files/")
                    .path(dbFile.getId())
                    .toUriString();

            return new FileUploadResponse(
                    dbFile.getName(),
                    fileDownloadUri,
                    dbFile.getType(),
                    dbFile.getData().length);
        ).collect(Collectors.toList());

        return ResponseEntity.status(HttpStatus.OK).body(files);
    

    @GetMapping("/files/id")
    public ResponseEntity<byte[]> getFile(@PathVariable String id) 
        FileUpload fileUpload = fileUploadService.getFile(id);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileUpload.getName() + "\"")
                .body(fileUpload.getData());
    




邮递员 POST 请求


MySQL 表 用户

文件上传

我与一个确认令牌实体有相同的关系,我必须确认一个用户电子邮件,该电子邮件在 ManyToOne 关系中可以正常工作,但事实并非如此。我使用的是相同的关系映射,但它给了我如上所示的空值。

   @ManyToOne
    @JoinColumn( name="user_id")
    private User user;

我可以很好地上传文件,但我希望能够跟踪用户及其文件。

【问题讨论】:

【参考方案1】:

您需要为该实体分配一个用户:

        FileUpload fileDB = new FileUpload(fileName, file.getContentType(), file.getBytes());
        fileDB.setUser(userThatSentImage); // you need to set user
        return fileUploadRepository.save(fileDB);

您如何验证用户身份?如果您使用的是 Spring Security,您可以在这里找到如何从会话中检索用户:https://www.baeldung.com/get-user-in-spring-security

【讨论】:

完美运行。感谢您的帮助:'D 太棒了!如果这对您有帮助,您可以接受答案:)

以上是关于Spring Boot Hibernate多对一不保存joinColumn结果的主要内容,如果未能解决你的问题,请参考以下文章

spring boot + MyBatisPlus 一对多、多对一、多对多的解决方案

spring-boot-jap-layui-mysql 完整的jpa多对一

spring-boot-jap-layui-mysql 完整的jpa多对一

spring boot jpa中的多对一映射中的外键未在子表中更新

Laravel 雄辩的关系多对一不起作用

spring-boot-mybatis-plus-layui 自定义代码生成完整多对一