使用 Spring JPA 和 H2 数据库,应用程序重启后 ID 不是结果

With Spring JPA and H2 database the ID isn't consequent after app restart

我正在使用 Spring Boot 开发一个简单的网络应用程序。我将 JPA 与嵌入式(本地)H2 数据库一起使用。
当我启动项目时,Hibernate 会自动生成所有表和连接。它工作正常。
一开始我使用 h2 内置控制台手动 运行 SQL 查询进行测试。

这是我的相关文件:
pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

application.yml(第一次ddl-auto:创建,然后更新):

spring:
    jpa:
        open-in-view: false
        hibernate:
            ddl-auto: update
        database-platform: org.hibernate.dialect.H2Dialect
    datasource:
        driverClassName: org.h2.Driver
        url: jdbc:h2:file:~/Documents/database/blog
        username: hazazs
        password: {password}
    h2:
        console:
            enabled: true
            path: /database

Blog.java

@Entity(name = "BLOGS")
public class Blog implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date posted;
    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;
    @ManyToOne
    private Blogger blogger;

Blogger.java

@Entity(name = "BLOGGERS")
public class Blogger implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique = true, nullable = false)
    private String email;
    @Column(nullable = false)
    private String password;
    @Column(nullable = false)
    private boolean gender;
    @Column(unique = true, nullable = false)
    private String username;
    @ManyToMany
    @JoinTable(
        name = "BLOGGERS_ROLES",
        joinColumns = {@JoinColumn(name = "BLOGGER_ID")},
        inverseJoinColumns = {@JoinColumn(name = "ROLE_ID")}
    )
    private Set<Role> roles = new HashSet<>();
    @OneToMany(mappedBy = "blogger", fetch = FetchType.EAGER)
    private Set<Blog> blogs = new HashSet<>();
    @Column(unique = true, nullable = false)
    private String code;
    @Column(nullable = false)
    private boolean enabled;

Role.java

@Entity(name = "ROLES")
public class Role implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique = true, nullable = false)
    private String name;
    @ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER)
    private Set<Blogger> bloggers = new HashSet<>();

对于第一个应用程序 运行,ID 自动递增 1。但随后我重新启动我的应用程序并再次连接数据库,但它也递增 1,但它始终以 32 开头。
因此,如果我第一次在 h2 控制台中手动 运行 查询 INSERT INTO ROLES (NAME) VALUES ('USER'),它会正确插入 ID 为 1 的 USER。
但是,如果我 运行 在应用程序重新启动后查询 INSERT INTO ROLES (NAME) VALUES ('ADMIN'),它会插入 ID 为 33 而不是 2 的 ADMIN。
第三个运行以65开头,依此类推。

到目前为止我已经尝试过(没有结果):
-@GeneratedValue
的第 4 代类型 -<scope>runtime</scope> 在 h2 依赖中
-数据库 url: url: jdbc:h2:file:~/Documents/database/blog;DB_CLOSE_ON_EXIT=FALSE

我如何实现,ID 从它在上一个应用程序中结束的地方继续?运行?

如何重启应用程序?应调用所有关闭挂钩,并且该过程应该正常关闭。

请参阅下文 URL 以正常关机。

How to shutdown a Spring Boot Application in a correct way?

数据库使用a cache of 32 entries for sequences,而auto-increment是内部实现的一个序列。如果系统崩溃而没有关闭数据库,最多丢失这么多数字。这类似于序列在其他数据库中的工作方式。在这种情况下,不能保证生成的序列值没有间隙。

关闭所有连接将关闭数据库,如果应用程序正常停止(使用关闭挂钩),数据库也会关闭。