проверка входных пружин с запросом пут - PullRequest
0 голосов
/ 18 ноября 2018

доброго дня всем,

У меня есть этот API для создания весеннего отдыха, который я собираю, и в настоящее время у меня проблема с методом put на моих контроллерах.

У меня есть вопросник, имеющий отношение к тестовому объекту:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="question_id", nullable = false, updatable = false)
private Long id;

@Column(name="question_text", nullable = false)
@NotNull
private String question;

@Column(name="question_weight", nullable = false)
@Min(1)
private Integer weight = 1;

@Column(name="question_type", nullable = false)
private String type = "radio";

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "last_modified", nullable = false)
@LastModifiedDate
private Date lastModified;

@ManyToOne(fetch = FetchType.LAZY, optional = false, targetEntity = com.QCMGenerator.QCMGenerator.Model.Test.class)
@JoinColumn(name = "test_id", referencedColumnName = "test_id", nullable = false, updatable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Test test;

Я написал ранее, спрашивая об этой проблеме, и мне сказали использовать DTO, так что я сделал, и вот мой вопрос DTO:

private Long id;

private String question;

private String type;

private Integer weight;

private Date lastModified;

private TestDTO test;

и этот метод put у меня в контроллере:

@PutMapping("/{questionID}")
public QuestionDTO updateQuestion(
        @PathVariable(value = "testID") Long testID,
        @PathVariable(value = "questionID") Long questionID,
        @Valid @RequestBody QuestionDTO newQuestion
){
    if(!testRepo.existsById(testID)){
        throw new ResourceNotFoundException("No test with the ID '"+testID+"' was found...");
    }

    QuestionDTO savedDTO = null;

    try {
        Question questionEntity = questionRepo.findById(questionID).get();
        QuestionDTO questionDTO = convertToDTO(questionEntity);
        if (newQuestion.getTest() != null) {
            questionDTO.setTest(newQuestion.getTest());
        }
        if (newQuestion.getQuestion() != null) {
            questionDTO.setQuestion(newQuestion.getQuestion());
        }
        if (newQuestion.getType() != null) {
            questionDTO.setType(newQuestion.getType());
        }
        if (newQuestion.getWeight() != null) {
            questionDTO.setWeight(newQuestion.getWeight());
        }
        Question newQuestionEntity = convertToEntity(questionDTO);
        Question saved = questionRepo.save(newQuestionEntity);
        savedDTO = convertToDTO(saved);
    }catch (Exception e){
        System.out.println(e.getMessage());
    }

    return savedDTO;
}

и я продолжаю получать эту ошибку на моей консоли IDE:

2018-11-18 21: 33: 12.249 WARN 12876 --- [nio-8080-exec-2] ohaiUnresolvedEntityInsertActions: HHH000437: Попытка сохранить одну или несколько сущностей, которые имеют ненулевую связь с несохраненным переходным процессом юридическое лицо. Несохраненный переходный объект должен быть сохранен в операции до сохранения этих зависимых объектов. Несохраненная временная сущность: ([com.QCMGenerator.QCMGenerator.Model.Test #]) Зависимые объекты: ([[com.QCMGenerator.QCMGenerator.Model.Question # 10]]) Не обнуляемая ассоциация (ы): ([com.QCMGenerator.QCMGenerator.Model.Question.test]) org.hibernate.TransientPropertyValueException: свойство Not-null ссылается на временное значение - временный экземпляр должен быть сохранен перед текущей операцией: com.QCMGenerator.QCMGenerator.Model.Question.test -> com.QCMGenerator.QCMGenerator.Model.Test; вложенным исключением является java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: свойство Not-null ссылается на временное значение - временный экземпляр должен быть сохранен перед текущей операцией: com.QCMGenerator.QCMGenerator.Model.Question.test -> com.QCMGenerator. QCMGenerator.Model.Test

Я надеялся, что кто-то здесь прояснит эту проблему для меня, так как я весь день зависал только на этом единственном методе, или другие методы работают нормально, я пробовал с DTO и без него, и прежде чем добавить его, у меня был проблема с методом, принимающим нулевые значения в определенных полях.

Я очень ценю любую помощь и благодарю всех за помощь.

всем хорошего дня. : D

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вам необходимо добавить идентификатор вашей сущности, чтобы сохранить сущность с этим идентификатором в качестве ссылки.

Легко решить:

Question newQuestionEntity = convertToEntity(questionDTO);
newQuestionEntity.setId(testID);

Лучшим решением будет:

questionDTO.setID(testID);
public Question convertToEntity(QuestionDTO qDto) {
       Question question = new Question(qDto.getID()) ;
        ....... 
        return question;
} 
0 голосов
/ 19 ноября 2018

Эта ошибка возникает, когда вы пытаетесь сохранить связь сущности с нулевым идентификатором. Означает ли этот случай convertToEntity метод в Question newQuestionEntity = convertToEntity(questionDTO);

возвращает questionEntity с новым Test объектом. Вы должны проверить все отношения внутри сущности на нулевое значение, когда их идентификатор равен нулю.

...