【问题标题】:Spring Boot JPA - SQLIntegrityConstraintViolationExceptionSpring Boot JPA - SQLIntegrityConstraintViolationException
【发布时间】:2020-09-12 05:41:05
【问题描述】:

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

我的模型类 - (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?

){}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我更新了问题描述,请检查,谢谢。
    • 如果您将答案附加到现有问题,请从数据库中检索该问题实体并将其与您正在创建的答案实体相关联
    • 那么,我需要在代码中更改什么。请帮助我会理解的
    • 在 answerrelt 上也使用 JoinColumn,使用 JPA 存储库按 ID 检索问题,并创建一个包含问题、答案和 answerrelt 组合的对象图,hibernate 将正确保存您的对象图。
    • 啊,听起来好像找不到问题,因为生成的 SQL 以错误的格式指定了 UUID。很高兴你明白了这一点。仔细想想,在数据库中使用不同的数据类型会更好吗?首先要确保索引是紧凑的,如果您尝试插入错误的类型,它也会在这里给出更有意义的错误。
    【解决方案2】:

    我终于找到了真正的问题。

    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
    

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 2017-09-17
      • 2018-07-10
      • 2021-04-02
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2021-01-18
      相关资源
      最近更新 更多