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多对一