Java 截断表数据后,主键不是从1开始的

Java 截断表数据后,主键不是从1开始的,java,jpa,spring-data-jpa,Java,Jpa,Spring Data Jpa,我正在使用 @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; 在UserDetails表中。但是,一旦我截断了UserDetails表,它就不是从初始值开始的Id值。我没有在db中给出序列,但它是作为序列添加的。首先,当您使用@GeneratedValue(strategy=GenerationType.AUTO)注释时,持久性提供程序将根据主键属性的类型确定值 此类型可以是numerical或UUID。对于

我正在使用

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

UserDetails
表中。但是,一旦我截断了
UserDetails
表,它就不是从初始值开始的Id值。我没有在db中给出序列,但它是作为序列添加的。

首先,当您使用
@GeneratedValue(strategy=GenerationType.AUTO)
注释时,持久性提供程序将根据主键属性的类型确定值

此类型可以是
numerical
UUID
。对于
数值
值(您的情况),生成基于
序列
或表
生成器
。因此,主键值在数据库级别是唯一的

现在让我们回到你的问题上来。
您可以做的是在数据库中查找生成的序列并重新创建它。

如果您使用
AUTO
,如果您使用hibernate,它将选择
策略之一来生成您的id。从引用:

自动-标识列、序列或表取决于 底层数据库

我补充说

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_DATA")
   @SequenceGenerator(sequenceName = "my_seq", allocationSize = 1, name = "SEQ_DATA")
   private int id;
若我正在截断表,我将使用删除序列,删除序列SEQ_数据; 然后我将再次创建SEQ_数据

创建序列序号数据最小值1最大值999999999999
从1递增1缓存20开始

1)您使用的是什么数据库?2) 你在数据库中看到hibernate_序列表了吗?AUTO说让JPA提供者做它想做的关于值生成的任何事情(所以它在你的例子中使用一个序列…但它同样可以使用AUTO_INCREMENT或任何东西),然后你在JPA不知道的情况下截断表。所以它继续使用它到达的序列。预期的结果不是从最初开始。如果您想截断一个表,那么您还需要删除/重置序列。为什么这对您来说是个问题?自动生成ID的唯一要求是唯一性。你不应该依赖任何其他财产