Spring JPA JoinTable

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

我有三个实体。我想保存一份调查。该调查将包含所有必要的数据:ID、部分、问题。 Survey_section_question 表已成功创建,当我想要检索现有数据时,我会收到所需的对象。 当我想要保存包含部分和问题的调查时遇到问题。我收到以下错误:

java.sql.SQLException: Field 'survey_id' doesn't have a default value

有人看到那里有什么错误吗? 我附上了三个实体的代码。提前感谢您的帮助!

    @Entity
    @Table(name="Surveys")
    @Data
    public class Survey {
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private String description;
        private String createdBy;
    
        @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
        @JoinTable(
                name = "survey_section_question",
                joinColumns = @JoinColumn(name = "survey_id"),
                inverseJoinColumns = @JoinColumn(name = "section_id")
        )
        private List<SurveySection> sections;
    }

    @Entity
    @Table(name="SurveySections")
    @Data
    public class SurveySection {
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private String description;
    
        @ManyToMany
        @JoinTable(
                name = "survey_section_question",
                joinColumns = @JoinColumn(name = "section_id"),
                inverseJoinColumns = @JoinColumn(name = "question_id")
        )
        private List<SurveyQuestion> questions;
    }

@Entity
@Table(name="SurveyQuestions")
@Data
public class SurveyQuestion {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    private String createdBy;
    private boolean textAnswer;
    private boolean gradeAnswer;
}

发送的json:

{"id":1,"name":"mu","description":"sss","createdBy":"xx","sections":[{"id":5,"name":"s2","description":"","questions":[{"id":15,"name":"adawd","description":"awdawd","createdBy":"","textAnswer":true,"gradeAnswer":true}],"selectedQuestion":"15"}]}

更新使用的代码:

@PutMapping("/{id}")
Survey update(@RequestBody Survey surveyData, @PathVariable Long id) {
    return surveyService.findById(id)
            .map(survey -> {
                survey.setName(surveyData.getName());
              survey.setDescription(surveyData.getDescription());
                survey.setSections(surveyData.getSections());
                survey.setCreatedBy("Test");
                return surveyService.save(survey);
            })
            .orElseGet(() -> surveyService.save(surveyData));
}

调查服务的保存只是对调用 save 的 jpa 存储库的默认调用。

spring-boot jpa
1个回答
0
投票

fetch类型仅用于查询。您的保存存储库方法将简单地调用

EntityManager.persist()
EntityManager.merge()
。 合并只会合并调查实体,而不是子实体。您需要使用
surveyService.save()
方法手动管理子级。

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