Spring Boot JPA - Исключение SQLIntegrityConstraintViolationException - PullRequest
0 голосов
/ 25 мая 2020

Пытаюсь сохранить значение с помощью jpa. Я получил SQLIntegrityConstraintViolationException.

Database ER Diagram

Мой класс модели - (user_answers) Таблица:

import org.hibernate.annotations.Type
import java.io.Serializable
import java.util.*
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "user_answers")
data class CustomUserAnswer (
    @Id
    @Type(type = "uuid-char")
    @Column(name = "id")
    var id: UUID = UUID.randomUUID(),
    @Column(name="answer")
    var answer: String = "",
    @Type(type = "uuid-char")
    @Column(name = "user_answer_id")
    var userAnswerId: UUID,
    @Column(name = "question_id")
    var questionId: UUID):Serializable{}

Мой класс модели - (user_answer_relt)

import org.hibernate.annotations.Type
import java.util.*
import javax.persistence.*

@Entity
@Table(name = "user_answer_relt")
data class UserAnswerRelt(
        @Id
        @Type(type = "uuid-char")
        @Column(name = "id")
        var id: UUID = UUID.randomUUID(),
        @Column(name="answer_submitted_by")
        var submittedUserName : String = "",
        @Type(type = "uuid-char")
        @Column(name="user_id")
        var userId : UUID
) {}

Сначала я сохраняю значения User_Answer_Relt и получаю User_Answer_Id Затем я создаю класс User_Answer с User_Answer_Id

Итак, теперь я пытаюсь сохранить значение User_Answer, на этот раз я получаю следующую проблему.

Ошибка:

> 19:49:43.079 [http-nio-9010-exec-1] ERROR
> o.h.e.jdbc.spi.SqlExceptionHelper - Cannot add or update a child row:
> a foreign key constraint fails (`test`.`user_answers`, CONSTRAINT
> `user_question_id_fk` FOREIGN KEY (`question_id`) REFERENCES
> `questions` (`id`)) 19:49:43.129 [http-nio-9010-exec-1] ERROR
> 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.dao.DataIntegrityViolationException: could not
> execute statement; SQL [n/a]; constraint [null]; nested exception is
> org.hibernate.exception.ConstraintViolationException: could not
> execute statement] with root cause
> java.sql.SQLIntegrityConstraintViolationException: Cannot add or
> update a child row: a foreign key constraint fails
> (`test`.`user_answers`, CONSTRAINT `user_question_id_fk` FOREIGN KEY
> (`question_id`) REFERENCES `questions` (`id`))

Я знаю Если Question_Id недоступен в таблице вопросов, это означает, что он генерирует указанное выше исключение, но я дважды проверил правильность данных. но я не знаю точной причины.

Я также пробовал столбец соединения в модели, но у меня все еще та же проблема

import org.hibernate.annotations.Type
import java.util.*
import javax.persistence.*

@Entity
@Table(name = "user_answers")
data class UserAnswer(
        @Id
        @Type(type = "uuid-char")
        @Column(name = "id")
        var id: UUID = UUID.randomUUID(),
        @Column(name="answer")
        var answer: String = "",
        @Type(type = "uuid-char")
        @Column(name = "user_answer_id")
        var userAnswerId: UUID,
        @Column(name = "question_id")
        var questionId:UUID,
        @ManyToOne(fetch = FetchType.LAZY,cascade = arrayOf(CascadeType.ALL))
        @JoinColumn(name = "question_id",insertable = false,updatable = false)
        var question: Question?

){}

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Наконец я нашел актуальную проблему.

import org.hibernate.annotations.Type
import java.io.Serializable
import java.util.*
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "user_answers")
data class CustomUserAnswer (
    @Id
    @Type(type = "uuid-char")
    @Column(name = "id")
    var id: UUID = UUID.randomUUID(),
    @Column(name="answer")
    var answer: String = "",
    @Type(type = "uuid-char")
    @Column(name = "user_answer_id")
    var userAnswerId: UUID,
    @Column(name = "question_id")
    var questionId: UUID):Serializable{}

В приведенном выше коде я забыл добавить внутренний тип столбца. Я исправил это, добавив следующий код.

     @Type(type = "uuid-char")
     @Column(name = "question_id")
     var questionId: UUID
1 голос
/ 25 мая 2020

Ваши сущности не отражают отношения между собой.

Hibernate будет передавать sh изменения в порядке, который не обязательно отражает порядок вашего кода, но если он знает, как все взаимосвязано, он может отправлять изменения в безопасном порядке.

CustomerUserAnswer должен иметь свойства типа UserAnswerRelt и Question, а не UUID, и вам потребуются аннотации @JoinColumn.

...