使用 Spring Command Line Runner 初始化数据

Posted

技术标签:

【中文标题】使用 Spring Command Line Runner 初始化数据【英文标题】:Data On Init With Spring Command Line Runner 【发布时间】:2020-09-11 17:04:05 【问题描述】:

在这里,我想在服务器以 Spring 命令行运行器开头的操作时将一些东西硬编码到 db 中

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

我正在进入的实体:-

产品类型

@Data
@Entity
@Table(name = "tbl_product_type_chemical")
public class ProductType implements IBaseData<Long> 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;
    private String name;
    @Column(columnDefinition = "text")
    private String description;
    

这是Runner的方法:-

private void loadProductTypeNew() throws Exception 
    String SUBMODULE = " [Init Data] " + " [loadProductTypeNew()] ";
    try 
        ProductType fp = productTypeRepository.getOne(1L);
        if (null == fp) 
            fp = new ProductType();
            fp.setId(1L);
            fp.setName("FINISH PRODUCT");
            productTypeRepository.save(fp);
        
        ProductType rm = productTypeRepository.getOne(2L);
        if (null != rm) 
            rm = new ProductType();
            rm.setId(2L);
            rm.setName("RAW MATERIAL");
            productTypeRepository.save(rm);
        
        ProductType sm = productTypeRepository.getOne(3L);
        if (null != sm) 
            sm = new ProductType();
            sm.setId(3L);
            sm.setName("SUPPORTING MATERIAL");
            productTypeRepository.save(sm);
        
     catch (Exception ex) 
        ApplicationLogger.logger.error(SUBMODULE + ex.getMessage(), ex);
        throw ex;
    



@Override
public void run(String... args) throws Exception 
    loadProductTypeNew();`

输出:-

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

我在运行方法中调用它。如果有人能解决,请提前感谢

【问题讨论】:

请向我们展示您的实体定义。同样对于这样的用例,使用 flyway/liquibase 可能会更容易,因此它会在第一个数据库迁移中输入您的数据,而您不需要手动关心这个? 我已经编辑了问题请看@Nadir 一旦主键被分配给给定的行,即使该行被删除,它也不会被分配给另一行。否则,您 DROP 表并再次创建。 我知道@MukeshKeshu 但是如何克服这种情况 我在 Spring Boot 项目中所做的是首先删除表 - 将 data.sql 添加到类路径并将 @GeneratedValue(strategy=GenerationType.AUTO) 用于我的 id。所以当应用程序启动时,sql文件中的数据会被加载到数据库中。看到这个 - ***.com/questions/38040572/… 【参考方案1】:

您的应用程序中的任何内容都不应依赖于 id 字段的特定值,因为它是由数据库生成的。

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

您的代码将与此类似

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

【讨论】:

能否请您举例说明您的答案??

以上是关于使用 Spring Command Line Runner 初始化数据的主要内容,如果未能解决你的问题,请参考以下文章

git command line instructions

IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...

Awesome Mac OS Command Line 中文翻译

mysql command line client 使用命令

mysql command line client 使用命令

MySQL Database Command Line Client