Java Springboot 2 Crudepository.save始终引发ConstraintViolationException
在我的项目中,我已经将Springboot版本从1.4.3.RELEASE迁移到了2.1.0.RELEASE。在此之后,crudepository.save()始终抛出org.hibernate.exception.ConstraintViolationException:无法执行语句 这是我在日志中看到的:Java Springboot 2 Crudepository.save始终引发ConstraintViolationException,java,hibernate,spring-boot,spring-data-jpa,Java,Hibernate,Spring Boot,Spring Data Jpa,在我的项目中,我已经将Springboot版本从1.4.3.RELEASE迁移到了2.1.0.RELEASE。在此之后,crudepository.save()始终抛出org.hibernate.exception.ConstraintViolationException:无法执行语句 这是我在日志中看到的: o.h.e.j.s.SqlExceptionHelper[m: SQL Error: 1062, SQLState: 23000 o.h.e.j.s.SqlExceptionHelper[
o.h.e.j.s.SqlExceptionHelper[m: SQL Error: 1062, SQLState: 23000
o.h.e.j.s.SqlExceptionHelper[m: Duplicate entry '11' for key 'PRIMARY'
o.h.i.ExceptionMapperStandardImpl[m: HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement
这就是我试图保存的实体
@Getter
@Setter
@Entity
@Table(name = "project_m")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name" , nullable = false)
private String name;
//other fields
}
从Springboot 1.4.3.RELEASE到2.1.0.RELEASE的变化是内部的Hibernate版本从5.0到5.3 这方面的变化是SequenceGenerator的工作方式,在策略为GenerationType.AUTO的情况下使用它(就像您的情况一样)。 链接到 有关hibernate生成策略的更多详细信息 我猜有两个并行会话插入到这个表中,它们现在共享一个序列号的本地副本,这导致了冲突。不过不确定
我的建议是将策略更改为GenerationType.SEQUENCE并尝试。从Springboot 1.4.3.RELEASE更改为2.1.0.RELEASE的是内部Hibernate版本,从5.0到5.3 这方面的变化是SequenceGenerator的工作方式,在策略为GenerationType.AUTO的情况下使用它(就像您的情况一样)。 链接到 有关hibernate生成策略的更多详细信息 我猜有两个并行会话插入到这个表中,它们现在共享一个序列号的本地副本,这导致了冲突。不过不确定
我的建议是将策略更改为GenerationType.SEQUENCE并重试。我通过在
hibernate\u SEQUENCE
表中设置一个较大的值,找到了解决此问题的方法。我看到重复主键错误的主键值是从名为hibernate\u sequence
的表中生成的
当我们在实体中设置GenerationType.AUTO时,Hibernate会根据Hibernate方言选择生成策略。在旧版本中,Hibernate选择GenerationType.IDENTITY
作为MySQL数据库的默认值
现在它选择了
GenerationType.TABLE
,它使用数据库表来生成主键我通过在hibernate\u序列
表中设置一个大值来解决这个问题。我看到重复主键错误的主键值是从名为hibernate\u sequence
的表中生成的
当我们在实体中设置GenerationType.AUTO时,Hibernate会根据Hibernate方言选择生成策略。在旧版本中,Hibernate选择GenerationType.IDENTITY
作为MySQL数据库的默认值
它现在选择
GenerationType.TABLE
,该表使用数据库表生成主键ConstraintViolationException
,因为SQL数据库的主键约束违反了
在SQL中,主键是标识记录的唯一键,当您尝试向主列插入重复值时,数据库将引发异常。
这反过来又被hibernate获取并传递到代码中,这就是此异常的原因
从Springboot 1.4.3.RELEASE到2.1.0.RELEASE Hibernate版本从5.0更新到5.3
从Hibernate版本5.0开始,Hibernate解释自动生成类型的方式已经改变
如果使用strategy=“AUTO”
,Hibernate将生成一个名为Hibernate\u sequence
的表,以提供ID序列的下一个编号。您可能忘记了将自动增量功能添加到表的PK中
另一种修复方法是将以下注释与strategy=“AUTO”
您可以使用generationstrategystrategy=“IDENTITY”
强制使用SQL中可用的自动增量功能,避免创建表
请检查以获取更多信息
ConstraintViolationException
由于SQL数据库的主键约束违反
在SQL中,主键是标识记录的唯一键,当您尝试向主列插入重复值时,数据库将引发异常。
这反过来又被hibernate获取并传递到代码中,这就是此异常的原因
从Springboot 1.4.3.RELEASE到2.1.0.RELEASE Hibernate版本从5.0更新到5.3
从Hibernate版本5.0开始,Hibernate解释自动生成类型的方式已经改变
如果使用strategy=“AUTO”
,Hibernate将生成一个名为Hibernate\u sequence
的表,以提供ID序列的下一个编号。您可能忘记了将自动增量功能添加到表的PK中
另一种修复方法是将以下注释与strategy=“AUTO”
您可以使用generationstrategystrategy=“IDENTITY”
强制使用SQL中可用的自动增量功能,避免创建表
请查看以获得更多信息“键“PRIMARY”的重复条目“11”-对我来说似乎不言自明。是的,但使用我提到的较旧版本的spring,我可以简单地保存它。你是说,如果你现在将版本更改为1.4.3并运行相同的代码,它会成功运行吗?不,我从1.4.3更新到2来重新表述这个问题:如果你恢复到1.4.3,这个确切的代码会工作吗?“键“PRIMARY”的重复条目“11”-对我来说似乎不言自明。是的,但是使用我提到的旧版本的spring,我可以简单地保存它。你是说,如果您将版本更改为1.4.3并立即运行相同的代码,它将成功运行吗?否,我将从1.4.3更新为2,以重新表述以下问题:如果您恢复到1.4.3,这段代码会正常工作吗?
@Id
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="native"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private Long id;