Я пытаюсь создать приложение весенней загрузки с двумя объектами: Question и QuestionChoices. Я использую двунаправленные отношения. Когда я пытаюсь создать сущность Вопрос вместе со списком Вопросов, внешний ключ в Вопросе выходит пустым.
Вот моя сущность 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;
}
}
Вот моя сущность Question:
@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 не только нулевые, но и список вариантов вопроса в объекте вопроса также равен нулю.
ЛюбойПонимаете, что я делаю неправильно?
Обновление
Я нашел хорошее решение этой проблемы здесь: Бесконечная рекурсия с Джексоном JSON иСпящий выпуск JPA . Проблема с Джексоном, а не с Hibernate. Просто добавьте дополнительную аннотацию к ссылочным объектам внутри сущностей, и все будет прекрасно!