Java 使用Spring命令行运行程序初始化数据

Java 使用Spring命令行运行程序初始化数据,java,spring,spring-boot,jpa,spring-data-jpa,Java,Spring,Spring Boot,Jpa,Spring Data Jpa,在这里,我想用Spring命令行运行程序启动服务器时将一些内容硬编码到db中 问题:-在本例中,我检查了如果1L不存在,则使用Id 1L对其进行输入,但当1L、2L或3L不存在时,它仍然存储到增量Id。 我在其中进行输入的实体:- 产品类型 输出:- 9 SUPPORTING MATERIAL 8 RAW MATERIAL 7 FINISH PRODUCT 10 FINISH PRODUCT 11 R

在这里,我想用Spring命令行运行程序启动服务器时将一些内容硬编码到db中

问题:-在本例中,我检查了如果1L不存在,则使用Id 1L对其进行输入,但当1L、2L或3L不存在时,它仍然存储到增量Id。

我在其中进行输入的实体:-

产品类型 输出:-

9           SUPPORTING MATERIAL
8           RAW MATERIAL
7           FINISH PRODUCT
10          FINISH PRODUCT
11          RAW MATERIAL
12          SUPPORTING MATERIAL
13          RAW MATERIAL
14          SUPPORTING MATERIAL

如果有人可以提前解决,那么应用程序中的任何内容都不应该依赖于id字段的特定值,因为它是由数据库生成的

因此,我建议标识一个业务键(在您的示例中是名称),确保它与主键是唯一的,并使用它来确定是否需要在数据库中插入行

您的代码看起来与此类似

if (productTypeRepository.existsByName(""FINISH PRODUCT")) {
    ProductType fp = new ProductType();
    fp.setName("FINISH PRODUCT");
    productTypeRepository.save(fp);
}

请向我们展示您的实体定义。此外,对于此类用例,使用flyway/liquibase可能会更容易,因此它会在第一次数据库迁移中输入您的数据,您无需手动处理此问题?我已编辑了此问题,请查看@NadirOnce主键已分配给给定行,即使删除该行,也不会分配给另一行。我知道@MukeshKeshu,但如何克服这种情况我在spring boot项目中做的是首先删除表-在类路径中添加data.sql,并在ID中使用@GeneratedValue(strategy=GenerationType.AUTO)。因此,当应用程序启动时,sql文件中的数据将加载到数据库中。看到这个-你能用一个例子来说明你的答案吗??
9           SUPPORTING MATERIAL
8           RAW MATERIAL
7           FINISH PRODUCT
10          FINISH PRODUCT
11          RAW MATERIAL
12          SUPPORTING MATERIAL
13          RAW MATERIAL
14          SUPPORTING MATERIAL
if (productTypeRepository.existsByName(""FINISH PRODUCT")) {
    ProductType fp = new ProductType();
    fp.setName("FINISH PRODUCT");
    productTypeRepository.save(fp);
}