我正在开发一个 spring crud thymeleaf 应用程序,代表与两个实体(Subject 和 TeacherTask)的工作。 这些实体具有一对多的关系。 TeacherTask 是一个用户可以上传到浏览器然后下载的文件
这是我的 TeacherTask 实体:
@Entity
@Table(name = "tasks")
public class TeacherTask {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_task")
private Long id;
@Column(name = "fileName")
private String fileName;
@Column(name = "fileType")
private String fileType;
@Lob
@Column(name = "data", length = 100000000)
private byte[] data;
@Column(name = "deadL")
private Date deadL;
@Column(name = "downloadURL")
private String downloadURL;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "subj_id")
private Subject subject;
public TeacherTask() {
}
public TeacherTask(String fileName, String fileType, byte[] data, Date deadL, String downloadURL, Subject subject) {
this.fileName = fileName;
this.fileType = fileType;
this.data = data;
this.deadL = deadL;
this.downloadURL = downloadURL;
this.subject = subject;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public Date getDeadL() {
return deadL;
}
public void setDeadL(Date deadL) {
this.deadL = deadL;
}
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
public String getDownloadURL() {
return downloadURL;
}
public void setDownloadURL(String downloadURL) {
this.downloadURL = downloadURL;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
}
我的 TeacherTask 控制器中有一个上传文件的方法:
@PostMapping("/uploadFile/{id}")
public String uploadFile(@RequestParam(value = "deadL") Date deadL, Model model,
@PathVariable("id") Long id,
@RequestParam("file") MultipartFile file) throws Exception {
Subject subject = subjectService.findById(id).orElseThrow();
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
System.out.println(fileName);
String downloadURL = "http://localhost:8080/downloadFile/" + fileName;
TeacherTask teacherTask = new TeacherTask(fileName, file.getContentType(),file.getBytes(), deadL, downloadURL,subject);
teacherTaskService.save(teacherTask);
model.addAttribute("files",teacherTaskService.findAll());
return "subjectPage";
}
我的问题是,如果我没有将Subject标识为TeacherTask构造函数中的参数,我将在数据库中的TeacherTask表中获得Subject的外键为空。 有没有一种方法可以在 DB 中获取此外键的非空值,而无需在 TeacherTask 构造函数中识别主题?
将实体对象放入另一个实体构造函数中是否是正确的方法?有什么替代方案吗?
public TeacherTask(String fileName, String fileType, byte[] data, Date deadL, String downloadURL, Subject subject) {
this.fileName = fileName;
this.fileType = fileType;
this.data = data;
this.deadL = deadL;
this.downloadURL = downloadURL;
this.subject = subject;
}
正确实施后,您需要链接这两个实体。当您创建新的子实体时,您需要在保存之前将其链接到其父实体,以便在数据库中正确设置外键以将其链接到父实体。
另一种选择是在子项中使用
subject
setter:
// uploadFile(...)
TeacherTask teacherTask = new TeacherTask(fileName, file.getContentType(), file.getBytes(), deadL, downloadURL);
// link the child to parent
teacherTask.setSubject(subject);
teacherTaskService.save(teacherTask);
这样你就可以拥有一个没有
Subject
的构造函数,但无论如何都可以。