首页 > 解决方案 > 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 之间出现空白。

标签: javaspringdatabaseresth2

解决方案


一般来说,数据库被设计为增量的。ID 生成时,不是根据表的内容生成的。而不是它,ID 是使用序列生成的。在您的示例中,您有一些记录,但想象一个有很多记录的数据库。数据库基于序列(或类似的)生成 ID,以避免读取数据,这是一个昂贵的过程。

如果 ID 与业务无关,则此行为不会影响您的流程。(就像聊天中的消息 ID)。

如果 ID 很重要,我建议重新定义删除过程。您可能需要保留所有 ID,例如客户 ID。

如果要保留序列并允许删除记录,建议自己生成id,但需要引导并发等问题


推荐阅读