Spring Boot - 加载初始数据

标签 spring spring-boot spring-data

我想知道在应用程序启动之前加载初始数据库数据的最佳方式是什么?我正在寻找的是可以用数据填充我的 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"));
    }
}

但我非常怀疑这是最好的方法。还是这样?

最佳答案

您可以在 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

更多信息可以在关于 Database initialization 的文档中找到。 .


如果您使用的是 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

关于Spring Boot - 加载初始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38040572/

相关文章:

java - Spring Data错误由: org. hibernate.QueryException引起:无法解析属性

gradle - java.lang.NoClassDefFoundError:javaslang/collection/LinkedHashMap,同时使用jmh对基准 Spring 数据应用程序进行基准测试

java - 如何仅使用关联对象的外键来保存 Spring 实体

spring-boot - 在 Spring Boot 中发送多部分响应

java - 如何在 Spring Data JPA 中保存期间避免选择语句

java - 第三方jar spring boot中的类文件内的@Value

java - 两个 jar 之间的 Spring Boot 和 @ComponentScan

java - Spring Data JPA - save() 方法在不使用返回实体的情况下工作得很好

java - 如何在 Spring 运行时更改属性值

java - Spring AOP 不拦截 Spring 容器内的方法