java - H2 数据库生成策略在 id 值之间留下空白
问题描述
我正在使用 Spring 开发 REST API。我有这个类,它的 id 是自动生成的:
@Entity
public class Seller implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private double tasa;
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getTasa() {
return tasa;
}
public void setTasa(double tasa) {
this.tasa = tasa;
}
}
我添加了一些端点来创建、删除和从数据库中获取卖家。所以当我从数据库中删除一个卖家时,我的问题就出现了。当我尝试创建一个新的时,我期望得到 id 的较低可用值,但实际上正在做的是使用某种计数器/序列。我来给你展示:
所以在我的第二个帖子指令中,我期待一个 id = 1 的 json,但我收到了一个 2。我尝试使用 TABLE 和 IDENTITY 策略,但不想要的行为仍在继续。所以我的问题是:我怎样才能实现我想要的行为?我不希望卖家 ID 之间出现空白。
解决方案
一般来说,数据库被设计为增量的。ID 生成时,不是根据表的内容生成的。而不是它,ID 是使用序列生成的。在您的示例中,您有一些记录,但想象一个有很多记录的数据库。数据库基于序列(或类似的)生成 ID,以避免读取数据,这是一个昂贵的过程。
如果 ID 与业务无关,则此行为不会影响您的流程。(就像聊天中的消息 ID)。
如果 ID 很重要,我建议重新定义删除过程。您可能需要保留所有 ID,例如客户 ID。
如果要保留序列并允许删除记录,建议自己生成id,但需要引导并发等问题
推荐阅读
- vue.js - Vue模板处理:如何删除文本节点和结束标记之间的尾随空格
- firebase - 如何在颤动中模糊网络图像
- webpack - webpack 给我错误“@font-face { ^ 意外令牌”
- tags - 使用 Zebra RFD8500 读取 Dogbone (Magnus 3) 传感器标签
- r - 在 R 中将列名作为变量传递的问题
- laravel - Laravel 中的 Vue 表单组件在提交时收到 422 错误
- java - Keycloak-Admin-Client in a JPMS/Jigsaw Java 11 Maven application - Dependency Problems
- javascript - React Native websocket event.data接收二进制数据时为空数组
- javascript - PHP 适用于 Localhost 但不适用于服务器
- linux - Divide words in one column to three equal columns using Linux terminal