Spring Boot 在启动时将示例数据插入数据库

Posted

技术标签:

【中文标题】Spring Boot 在启动时将示例数据插入数据库【英文标题】:Spring Boot insert sample data into database upon startup 【发布时间】:2017-11-28 16:16:06 【问题描述】:

在服务器启动时创建测试数据并将它们插入数据库的正确方法是什么(我使用的是 JPA/JDBC 支持的 Postgres 实例)。

最好以创建实体并让它们通过存储库接口持久化的形式,而不是编写简单的 SQL 代码。类似于 RoR 的 Rake db:seed 助手。

如果框架在所有 bean 都被注入并且数据库准备就绪时公开一个钩子来做一些事情,那也可以工作。

【问题讨论】:

如果对你有帮助,别忘了接受/upvote这个答案。 【参考方案1】:

你可以捕捉ApplicationReadyEvent然后插入演示数据,例如:

@Component
public class DemoData 

    @Autowired
    private final EntityRepository repo;

    @EventListener
    public void appReady(ApplicationReadyEvent event) 

        repo.save(new Entity(...));
    

或者您可以实现CommandLineRunnerApplicationRunner,在应用程序完全启动时加载演示数据:

@Component
public class DemoData implements CommandLineRunner 

    @Autowired
    private final EntityRepository repo;

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

        repo.save(new Entity(...));
    


@Component
public class DemoData implements ApplicationRunner 

    @Autowired
    private final EntityRepository repo;

    @Override
    public void run(ApplicationArguments args) throws Exception 

        repo.save(new Entity(...));
    

甚至可以在您的应用程序(或其他“配置”)类中像 Bean 一样实现它们:

@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Bean
    public CommandLineRunner demoData(EntityRepository repo) 
        return args ->  

            repo.save(new Entity(...));
        
    

【讨论】:

@Autoware 注释应该是@Autowired 吗? 如果我想冒充用户,例如我有安全方法,该怎么办?你能更新你的例子吗?【参考方案2】:

来自 Spring 文档:http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#howto-database-initialization

使用 Hibernate 初始化数据库 如果 Hibernate 从头开始​​创建模式(也就是说,如果 ddl-auto 属性设置为 create 或 create-drop),则类路径根目录中名为 import.sql 的文件将在启动时执行。如果您小心的话,这对于演示和测试很有用,但可能不是您希望在生产中的类路径上出现的东西。这是一个 Hibernate 特性(与 Spring 无关)。

【讨论】:

类路径的根是什么意思? src 文件夹的根目录?因为我认为这个定义相当依赖于构建工具/平台。 如果你使用的是 Maven,那么像这样的文件夹:/src/main/resources @Parsoa 谢谢。无论如何,对于我需要插入的数据量,这种方法似乎很容易出错且耗时。如果有 Java 解决方案,我会更喜欢它。 这是根据 Spring Boot 文档尝试实现的唯一解决方案【参考方案3】:

你可以这样做

    @SpringBootApplication
    public class H2Application 

        public static void main(String[] args) 
            SpringApplication.run(H2Application.class, args);
        

        @Bean
        CommandLineRunner init (StudentRepo studentRepo)
            return args -> 
                List<String> names = Arrays.asList("udara", "sampath");
                names.forEach(name -> studentRepo.save(new Student(name)));
            ;
        
    

【讨论】:

以上是关于Spring Boot 在启动时将示例数据插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中 JWT 的最佳实践是啥?

Flyway Spring Boot应用程序在启动时不应用插入脚本

使用 JPA 和 mysql 启动在 Spring Boot 中创建的应用程序时出错

如何使 Kafka 接收器连接器在接收器启动时将数据从主题插入到表中

如何在 Spring Boot 中使用 JavaScript、jQuery 的 Ajax 成功时将数字转化为星级?

Spring Boot 数据库初始化只有一次