【发布时间】:2019-10-16 11:13:22
【问题描述】:
我正在尝试创建一个包含两个实体的 Spring Boot 应用程序:Question 和 QuestionChoices。我正在使用双向单对多关系。当我尝试创建一个 Question 实体以及 QuestionChoices 列表时,QuestionChoice 中的外键为空。
这是我的 QuestionChoice 实体:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class QuestionChoice {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String choice;
@ManyToOne
@JoinColumn(name = "question_id")
private Question question;
public QuestionChoice(String choice, Question question) {
this.choice = choice;
this.question = question;
}
public QuestionChoice(String choice) {
this.choice = choice;
}
}
这是我的问题实体:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int question_id;
private String questionName;
private String questionText;
@OneToMany(mappedBy = "question", cascade = CascadeType.ALL)
private List<QuestionChoice> questionChoices;
public Question(String questionName, String questionText, List<QuestionChoice> questionChoices) {
this.questionName = questionName;
this.questionText = questionText;
this.questionChoices = questionChoices;
this.questionChoices.forEach(x -> x.setQuestion(this));
}
}
我有一个 QuestionRepository 和 QuestionChoiceRepository:
@Repository
public interface QuestionRepository extends JpaRepository<Question, Integer> {
}
@Repository
public interface QuestionChoiceRepository extends JpaRepository<QuestionChoice, Integer> {
}
这是我的控制器:
@RestController
public class Controller {
QuestionRepository questionRepository;
QuestionChoiceRepository questionChoiceRepository;
public Controller(QuestionRepository questionRepository,
QuestionChoiceRepository questionChoiceRepository) {
this.questionRepository = questionRepository;
this.questionChoiceRepository = questionChoiceRepository;
}
@PostMapping("/question")
public Question createQuestion(@RequestBody Question question) {
return questionRepository.save(question);
}
@GetMapping("/question")
public List<Question> getQuestions() {
return questionRepository.findAll();
}
}
这是我的 POST 请求:
POST http://localhost:8080/question
Content-Type: application/json
{
"questionName": "gender",
"questionText": "What is your gender?",
"questionChoices": ["male", "female"]
}
这是来自 POST 的回复:
{
"id": 1,
"questionName": "gender",
"questionText": "What is your gender?",
"questionChoices": [
{
"id": 1,
"choice": "male",
"question": null
},
{
"id": 2,
"choice": "female",
"question": null
}
]
}
这是来自 GET 请求的响应:
GET http://localhost:8080/question
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 16 Oct 2019 11:10:51 GMT
[
{
"id": 1,
"questionName": "gender",
"questionText": "What is your gender?",
"questionChoices": []
}
]
因此,不仅 QuestionChoices 的外键为空,而且问题实体中的问题选择列表也为空。
知道我做错了什么吗?
更新
我在这里找到了解决此问题的好方法:Infinite Recursion with Jackson JSON and Hibernate JPA issue。问题在于杰克逊,而不是 Hibernate。只需向实体中的引用对象添加一个额外的注释,一切都很好!
【问题讨论】:
标签: java hibernate spring-boot jpa