Я разрабатываю приложение для управления опросами. При выполнении метода POST для создания нового опроса с использованием @RestController я получаю ошибку
2020-02-19 18:10:34.257 ERROR 8648 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find pl.wsisiz.asp.domain.OptionGroup with id 1; nested exception is javax.persistence.EntityNotFoundException: Unable to find pl.wsisiz.asp.domain.OptionGroup with id 1] with root cause
javax.persistence.EntityNotFoundException: Unable to find pl.wsisiz.asp.domain.OptionGroup with id 1
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:163) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:216) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at ...
.....
Так как ошибка unable to find optionGroupId
Я думаю, что проблема может быть связана с отношением между Question и OptionGroup. OptionGroups можно использовать во многих Вопросах, но Вопрос всегда имеет 1 или нет OptionGroup.
Модель - Вопрос. java
package pl.wsisiz.asp.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.LinkedHashSet;
import java.util.Set;
@Entity
@Table(name = "questions")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Question {
@Id
@GeneratedValue
@Column(name = "question_id")
private Integer questionId;
//other fields
...
@ManyToOne
@JoinColumn(name = "option_group_id")
// @NotFound(action = NotFoundAction.IGNORE) //with this line there is no error
// and optionGroup is always null
private OptionGroup optionGroup;
}
Модель - OptionGroup. java
package pl.wsisiz.asp.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.LinkedHashSet;
import java.util.Set;
@Entity
@Table(name = "option_groups")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class OptionGroup {
@Id
@GeneratedValue
@Column(name = "option_group_id")
private Integer optionGroupId;
//other fields
// ...
@OneToMany(mappedBy = "optionGroup", cascade = {CascadeType.ALL})
@JsonIgnore
private Set<Question> questions = new LinkedHashSet<>();
}
При выполнении метода POST контроллер использует addSurvey(@RequestBody SurveyTemplate surveyTemplate)
. surveyTemplate сохраняется методом save()
из JpaRepository.
Вызывая этот метод POST, я помещаю в тело JSON, полученное с помощью метода GET (после этого я удалил содержимое базы данных). JSON, который я помещаю в тело, выглядит следующим образом:
{
"surveyTemplateId": 1,
"surveyName": "Example survey",
"instructions": null,
"otherInfo": null,
"surveySections": [
{
"surveySectionId": 1,
"sectionName": "Metric",
"questions": [
{
"questionId": 1,
"questionName": "Age:",
"answerRequired": true,
"inputType": "CHOICE",
"subquestions": [],
"optionGroup": {
"optionGroupId": 1,
"optionGroupName": "age20-25+",
"optionChoices": [
{
"optionChoiceId": 1,
"optionChoiceName": "less than 20"
},
{
"optionChoiceId": 2,
"optionChoiceName": "20"
},
{
"optionChoiceId": 3,
"optionChoiceName": "21"
},
{
"optionChoiceId": 4,
"optionChoiceName": "22"
},
{
"optionChoiceId": 5,
"optionChoiceName": "23"
},
{
"optionChoiceId": 6,
"optionChoiceName": "24"
},
{
"optionChoiceId": 7,
"optionChoiceName": "more than 25"
}
]
}
}
]
}
]
}
РЕДАКТИРОВАТЬ:
Когда я заменил отношение многие-к-одному (отмечено на диаграмме) со многими к маме все работает как надо. Вы можете увидеть весь ERD до этого изменения. Тем не менее, я на самом деле не знаю, почему он не работает со многими к одному и есть ли способ сделать это с отношением многих к одному.