Spring Boot JPA-SQLIntegrityConstraintViolationException

时间:2020-05-25 14:47:03

标签: java spring-boot kotlin spring-data-jpa

我正在尝试使用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_Id构建User_Answer类

因此,现在我正试图保存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 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

最后,我找到了实际的问题。

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{}

在上面的代码中,我忘记添加Column内部类型,我通过添加以下代码进行了修复。

     @Type(type = "uuid-char")
     @Column(name = "question_id")
     var questionId: UUID
相关问题