EntityNotFoundException, выполняющий метод POST - PullRequest
0 голосов
/ 19 февраля 2020

Я разрабатываю приложение для управления опросами. При выполнении метода 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 до этого изменения. Тем не менее, я на самом деле не знаю, почему он не работает со многими к одному и есть ли способ сделать это с отношением многих к одному.

ERD

...