使用 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 初始化数据的主要内容,如果未能解决你的问题,请参考以下文章
IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...
Awesome Mac OS Command Line 中文翻译
mysql command line client 使用命令