Java Spring Boot JPA-SQLIntegrityConstraintViolationException

Java Spring Boot JPA-SQLIntegrityConstraintViolationException,java,spring-boot,kotlin,spring-data-jpa,Java,Spring Boot,Kotlin,Spring Data Jpa,我正在尝试使用jpa保存值。我得到了SQLIntegrityConstraintViolationException. 我的模型类-(用户回答)表: import org.hibernate.annotations.Type import java.io.Serializable import java.util.* import javax.persistence.Column import javax.persistence.Entity import javax.persistence.

我正在尝试使用jpa保存值。我得到了SQLIntegrityConstraintViolationException.

我的模型类-(用户回答)表:

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{}
> 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`))
我的模型类-(用户回答)

首先,我保存User\u Answer\u Relt值并获取User\u Answer\u Id,然后用User\u Answer\u Id构建User\u Answer类

所以,现在我正试图保存用户回答值,这次我得到了下面的问题

错误:

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{}
> 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`))
我知道,如果问题表中的问题Id不可用,则表示抛出上述异常,但我仔细检查了数据是否正确。但我不知道确切的原因。

我也尝试了模型中的Join列,但仍然遇到同样的问题

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?

){}

您的实体没有反映彼此之间的关系

Hibernate将以不一定反映代码顺序的顺序刷新更改,但是如果它知道事情之间的关系,它可以以安全的顺序发送更改


CustomerUserAnswer应该具有UserAnswerRelt和Question类型的属性,而不是UUID,并且您需要@JoinColumn注释。

您的实体没有反映彼此之间的关系

Hibernate将以不一定反映代码顺序的顺序刷新更改,但是如果它知道事情之间的关系,它可以以安全的顺序发送更改


CustomerUserAnswer应该具有UserAnswerRelt和Question类型的属性,而不是UUID,并且您需要@JoinColumn注释。

最后我发现了实际问题

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

最后我找到了真正的问题

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

我更新了问题描述,请检查,谢谢。如果您将答案附加到现有问题,请从数据库中检索该问题实体,并将其与您正在创建的答案实体关联。因此,我需要在代码中更改什么。请帮助我理解answerrelt上的JoinDuse列,使用JPA存储库按ID检索问题,并创建一个结合了问题、答案和answerrelt的对象图,hibernate将正确保存您的对象图。啊,因此,听起来似乎无法找到问题,因为生成的SQL以错误的格式指定了UUID。很高兴你查到了真相。反思一下,在DB中使用不同的数据类型会更好吗?首先,确保索引紧凑,如果您尝试插入错误的类型,也会在此处产生一个更有意义的错误。我更新了问题说明,请检查,谢谢。如果您是在现有问题上附加答案,从数据库中检索该问题实体,并将其与您正在创建的答案实体关联。因此,我需要在代码中更改什么。请帮助我理解answerrelt上的JoinDuse列,使用JPA存储库按ID检索问题,并创建一个结合了问题、答案和answerrelt的对象图,hibernate将正确保存您的对象图。啊,因此,听起来似乎无法找到问题,因为生成的SQL以错误的格式指定了UUID。很高兴你查到了真相。经过反思,在DB中使用不同的数据类型会更好吗?首先,要确保索引是紧凑的,而且如果您试图插入错误的类型,这里会出现一个更有意义的错误。