Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Springboot 2 Crudepository.save始终引发ConstraintViolationException_Java_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java Springboot 2 Crudepository.save始终引发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[

在我的项目中,我已经将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[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.05.3

这方面的变化是SequenceGenerator的工作方式,在策略为GenerationType.AUTO的情况下使用它(就像您的情况一样)。

链接到

有关hibernate生成策略的更多详细信息

我猜有两个并行会话插入到这个表中,它们现在共享一个序列号的本地副本,这导致了冲突。不过不确定


我的建议是将策略更改为GenerationType.SEQUENCE并尝试。

从Springboot 1.4.3.RELEASE更改为2.1.0.RELEASE的是内部Hibernate版本,从5.05.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”

您可以使用generationstrategy
strategy=“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”

您可以使用generationstrategy
strategy=“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;