Spring data Jpa 具有一对多关系,实体作为构造函数中的参数

问题描述 投票:0回答:1

我正在开发一个 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;

    }

如果我不将主题放入 TeacherTask 构造函数中,这就是我的 TeacherTask 表的样子 enter image description here

spring-data-jpa foreign-keys thymeleaf
1个回答
0
投票

正确实施后,您需要链接这两个实体。当您创建新的子实体时,您需要在保存之前将其链接到其父实体,以便在数据库中正确设置外键以将其链接到父实体。

另一种选择是在子项中使用

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
的构造函数,但无论如何都可以。

© www.soinside.com 2019 - 2024. All rights reserved.