Como fazer upload com relacionamento de entidade ManyToOne e salvar no banco de dados?

Como faço para fazer upload (MultipartFile) com relacionamento ManyToOne, no meu caso, quero fazer upload de imagem em um Chamado(Entidade). Segue o código abaixo:

Model

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String filename;
private String url;
@ManyToOne
@JoinColumn(name = “chamado_id”)
private Chamado chamado;
@Lob
private byte[] data;

public FileInfo(Long id, String filename, String url, Chamado chamado, byte[] data) {

this.id = id;
this.filename = filename;
this.url = url;
this.chamado = chamado;
this.data = data;

}

Service

@Override
public void salvar(MultipartFile file){
     String fileName = StringUtils.cleanPath(file.getOriginalFilename());

    try {
        Files.copy(file.getInputStream(), this.rootLocation.resolve(file.getOriginalFilename()));
        FileInfo fileInfo = new FileInfo(null, fileName, file.getContentType(), null, file.getBytes());

        fileStorageRepository.save(fileInfo);
    } catch (Exception e) {
        throw new RuntimeException("FAIL! -> message = " + e.getMessage());
    }
}

Controller

@RequestMapping(value = "/novo", method = RequestMethod.POST)
public ModelAndView  salvar(@Validated @ModelAttribute("chamado") Chamado chamado, BindingResult result, RedirectAttributes attributes,
        @RequestParam("uploadfile") MultipartFile file, Model model) {

    if(result.hasErrors()){
         return novo(chamado);
    }

    try {
        chamado.setStatus(Status.NOVO);

        fileStorage.salvar(file); // Salva 
        model.addAttribute("message", "File uploaded successfully! -> filename = " + file.getOriginalFilename());
        chamadoService.salvar(chamado);

        attributes.addFlashAttribute("mensagem", "Ticket salvo com sucesso!");
        return new ModelAndView("redirect:/tickets/novo"); 

    } catch (NumberFormatException e) {
        model.addAttribute("message", "Fail! -> uploaded filename: " + file.getOriginalFilename());
        ModelAndView mv = new ModelAndView(CADASTRO_VIEW);
        result.addError(new ObjectError("error", e.getMessage()));
        return mv;

    }   
}

Cara, na boa, não posta imagem. Qual a dificuldade em pegar o código, copiar e colar aqui, utilizar o formatador de código (botão </> acima do editor de texto)?

Com relação a tua questão.
Quando você tem uma entidade e a mesma possui relacionamento, qualquer que seja, tanto para inserir quanto atualizar, você precisa deixar todos os lados cientes de que algo acontece. Logo, você vai ser obrigado a atualizar os objetos relacionados a entidade em questão e, posterior, executar a ação desejada.

1 curtida