我想知道在应用程序启动之前加载初始数据库数据的最佳方法是什么?我要找的是一些东西,将填补我的H2数据库与数据。

例如,我有一个域模型“User”,我可以通过访问/users访问用户,但最初在数据库中不会有任何用户,所以我必须创建它们。有没有办法自动用数据填充数据库?

目前,我有一个Bean,它由容器实例化并为我创建用户。

例子:

@Component
public class DataLoader {

    private UserRepository userRepository;

    @Autowired
    public DataLoader(UserRepository userRepository) {
        this.userRepository = userRepository;
        LoadUsers();
    }

    private void LoadUsers() {
        userRepository.save(new User("lala", "lala", "lala"));
    }
}

但我非常怀疑这是不是最好的办法。真的是这样吗?


当前回答

您可以简单地创建一个导入。在src/main/resources中创建一个sql文件,Hibernate将在创建模式时执行它。

其他回答

您可以简单地创建一个导入。在src/main/resources中创建一个sql文件,Hibernate将在创建模式时执行它。

您可以向应用程序添加spring.datasource.data属性。列出要运行的SQL文件的属性。是这样的:

spring.datasource.data=classpath:accounts.sql, classpath:books.sql, classpath:reviews.sql

//or (depending on SB version)

spring.sql.init.data-locations=classpath:accounts.sql, classpath:books.sql, file:reviews.sql

然后将运行每个文件中的sql insert语句,以便保持整洁。

如果你把文件放在类路径中,例如src/main/resources,它们就会被应用。或者将classpath:替换为file:,并使用文件的绝对路径

如果你想运行DDL类型的SQL,那么使用:

spring.datasource.schema=classpath:create_account_table.sql

// depending on spring version

spring.sql.init.schema-locations=classpath:create_account_table.sql 

编辑:这些解决方案可以让你快速启动和运行,但是对于更适合生产的解决方案,值得考虑一个框架,如flyway或libase。这些框架很好地与spring集成,并提供了一种快速、一致、版本控制的初始化模式和站立数据的方法。

如果有人在努力使这个工作,即使是在接受的答案之后,对我来说,只在我的src/test/资源/应用程序中添加工作。yml H2数据源详细信息:

spring:
  datasource:
    platform: h2
    url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
    driver-class-name: org.h2.Driver
    username: sa
    password:

如果我只想插入简单的测试数据,我通常实现一个ApplicationRunner。这个接口的实现在应用程序启动时运行,可以使用自动连接的存储库来插入一些测试数据。

我认为这样的实现会比您的实现稍微明确一些,因为接口暗示您的实现包含一些您希望在应用程序准备好之后直接执行的操作。

你的实现看起来像这样:

@Component
public class DataLoader implements ApplicationRunner {

    private UserRepository userRepository;

    @Autowired
    public DataLoader(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void run(ApplicationArguments args) {
        userRepository.save(new User("lala", "lala", "lala"));
    }
}

下面是我得到答案的方法:

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    /**
     * This event is executed as late as conceivably possible to indicate that
     * the application is ready to service requests.
     */

    @Autowired
    private MovieRepositoryImpl movieRepository;

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event) {
        seedData();
    }

    private void seedData() {
        movieRepository.save(new Movie("Example"));

        // ... add more code
    }

}

感谢本文作者:

http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/