我有三个实体。我想保存一份调查。该调查将包含所有必要的数据: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 存储库的默认调用。
fetch类型仅用于查询。您的保存存储库方法将简单地调用
EntityManager.persist()
或 EntityManager.merge()
。 合并只会合并调查实体,而不是子实体。您需要使用 surveyService.save()
方法手动管理子级。