Java Spring Boot JPA-SQLIntegrityConstraintViolationException
我正在尝试使用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.
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中使用不同的数据类型会更好吗?首先,要确保索引是紧凑的,而且如果您试图插入错误的类型,这里会出现一个更有意义的错误。