【发布时间】:2020-05-19 11:04:08
【问题描述】:
我有一个实体,Question,我想将其保存到数据库中。每个问题都通过 questionId 字段由一些 Answers 引用。
两个实体都有一个 ID 字段,该字段在持久化时会自动生成。以下是实体的简化代码:
Question.java
@Data
@Entity
public class Question {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Size(max=1000, message="Text too long")
@NotNull(message="Field text cannot be null")
private String text;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="id", referencedColumnName = "questionId")
private List<Answer> answers;
}
Answer.java
@Data
@Entity
public class Answer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Size(max=255, message="Text too long")
@NotNull(message="Field text cannot be null")
private String text;
@NotNull(message="Field questionId cannot be null")
private Integer questionId;
}
因此,为了保留一个包含一些答案的 Question 对象,我创建了那些没有 ID 字段的对象,这些对象将自动生成。 Question 对象从 QuestionController 中的 JSON 序列化:
@RestController
@RequestMapping(value="/questions")
public class QuestionController {
@Autowired
private QuestionRepository questionRepository;
@PostMapping
public void createQuestion(@RequestBody Question question){
questionRepository.save(question);
}
}
问题是我还必须将 questionId 字段留空,因为在将其写入数据库之前我不知道它。这会导致事务在请求该字段的值时抛出错误。
到目前为止,我想出的唯一解决方案是从问题中删除答案,一旦保留,填写 questionId 值并分别保存答案。
有什么方法可以同时进行这些交易吗?
【问题讨论】:
-
您不使用
Integer字段来引用问题。要么完全忽略它(使其成为从问题到答案的单向关联),要么使其成为对Question对象的引用(使其成为双向关联)。有关详细信息,请参阅教程。
标签: java spring-boot jpa jackson