I am trying to create a spring boot application with two entities: Question and QuestionChoices. I'm using a bidirectional onetomany relationship. When I try to create a Question entity along with a list of QuestionChoices, the foreign key in the QuestionChoice is coming out null.
Here is my QuestionChoice entity:
@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;
}
}
Here is my Question entity:
@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));
}
}
I have a QuestionRepository and QuestionChoiceRepository:
@Repository
public interface QuestionRepository extends JpaRepository<Question, Integer> {
}
@Repository
public interface QuestionChoiceRepository extends JpaRepository<QuestionChoice, Integer> {
}
Here is my controller:
@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();
}
}
Here is my POST request:
POST http://localhost:8080/question
Content-Type: application/json
{
"questionName": "gender",
"questionText": "What is your gender?",
"questionChoices": ["male", "female"]
}
Here is the response from the POST:
{
"id": 1,
"questionName": "gender",
"questionText": "What is your gender?",
"questionChoices": [
{
"id": 1,
"choice": "male",
"question": null
},
{
"id": 2,
"choice": "female",
"question": null
}
]
}
And here is the response from the GET request:
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": []
}
]
So not only are the foreign keys of the QuestionChoices null, but the list of question choices in the question entity is also null.
Any idea what I am doing wrong?
Update
I've found a good solution to this problem here: Infinite Recursion with Jackson JSON and Hibernate JPA issue. The problem is with Jackson, not Hibernate. Just add an additional annotation to the reference objects within the entities and everything works great!