使用Spring JPA和H2数据库,应用程序重新启动后ID不会产生



我正在使用Spring Boot开发一个简单的Web应用程序。我使用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自动:创建,然后更新(:

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;

角色.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 GenerationType
-<scope>runtime</scope>在h2依赖项中
-databaseurl:url:jdbc:h2:file:~/Documents/database/blog;DB_CLOSE_ON_EXIT=FALSE

如何实现ID从上次应用程序运行时完成的位置继续?

如何重新启动应用程序?所有的关机挂钩都应该被调用,进程应该是一个优雅的关机。

请参阅下面的URL以获得正常关闭。

如何以正确的方式关闭Spring Boot应用程序?

数据库为序列使用32个条目的缓存,自动增量在内部实现为一个序列。如果系统在没有关闭数据库的情况下崩溃,那么最多会丢失这么多数字。这与序列在其他数据库中的工作方式类似。在这种情况下,序列值不能保证在没有间隙的情况下生成

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

最新更新