Spring Boot - 加载初始数据

新手上路,请多包涵

我想知道在应用程序启动之前加载初始数据库数据的最佳方法是什么?我正在寻找的是可以用数据填充我的 H2 数据库的东西。

例如,我有一个域模型“用户”,我可以通过转到 /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"));
    }
}

但我非常怀疑这是最好的方法。或者是吗?

原文由 Lithicas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 443
1 个回答

您可以在 src/main/resources 文件夹中创建一个 data.sql 文件,它将在启动时自动执行。在此文件中,您可以添加一些插入语句,例如:

 INSERT INTO users (username, firstname, lastname) VALUES
  ('lala', 'lala', 'lala'),
  ('lolo', 'lolo', 'lolo');


同样,您也可以创建一个 schema.sql 文件(或 schema-h2.sql)来创建您的架构:

 CREATE TABLE task (
  id          INTEGER PRIMARY KEY,
  description VARCHAR(64) NOT NULL,
  completed   BIT NOT NULL);

尽管通常您不必这样做,因为 Spring boot 已经将 Hibernate 配置为基于您的实体为内存数据库创建模式。如果您真的想使用 schema.sql,则必须通过将其添加到 application.properties 来禁用此功能:

 spring.jpa.hibernate.ddl-auto=none

可以在有关 数据库初始化 的文档中找到更多信息。


如果您使用的是 Spring Boot 2 ,则数据库初始化仅适用于嵌入式数据库(H2、HSQLDB、…)。如果您也想将其用于其他数据库,则需要更改初始化模式属性:

 spring.sql.init.mode=always # Spring Boot >=v2.5.0
spring.datasource.initialization-mode=always # Spring Boot <v2.5.0


如果您使用多个数据库供应商,您可以根据要使用的数据库平台命名文件 data-h2.sqldata-mysql.sql

要使其工作,您必须配置数据源平台属性:

 spring.sql.init.platform=h2 # Spring Boot >=v2.5.0
spring.datasource.platform=h2 # Spring Boot <v2.5.0

原文由 g00glen00b 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题