我想知道在应用程序启动之前加载初始数据库数据的最佳方法是什么?我要找的是一些东西,将填补我的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"));
    }
}

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


当前回答

如果你想只插入几行,你有JPA设置。您可以使用下面的方法

    @SpringBootApplication
        @Slf4j
        public class HospitalManagementApplication {

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

            @Bean
            ApplicationRunner init(PatientRepository repository) {
                return (ApplicationArguments args) ->  dataSetup(repository);
            } 

            public void dataSetup(PatientRepository repository){
            //inserts

     }

其他回答

最紧凑的(对于动态数据)将@mathias-dpunkt解决方案放入MainApp(使用Lombok @AllArgsConstructor):

@SpringBootApplication
@AllArgsConstructor
public class RestaurantVotingApplication implements ApplicationRunner {
  private final VoteRepository voteRepository;
  private final UserRepository userRepository;

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

  @Override
  public void run(ApplicationArguments args) {
    voteRepository.save(new Vote(userRepository.getOne(1), LocalDate.now(), LocalTime.now()));
  }
}

在Spring Boot 2数据中。SQL不像spring boot 1.5那样适合我

import.sql

此外,还有一个名为import的文件。如果Hibernate从头创建模式(也就是说,如果ddl-auto属性设置为create或create-drop),则在启动时执行类路径根目录中的sql。

非常重要的一点是,如果你插入键不可复制,不要使用ddl-auto属性被设置为更新,因为每次重启都会再次插入相同的数据

欲了解更多信息,请访问spring网站

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

Spring Boot允许您使用一个简单的脚本来初始化数据库,使用Spring Batch。

不过,如果您想使用一些更详细的东西来管理DB版本等等,Spring Boot可以很好地与Flyway集成。

参见:

Spring Boot数据库初始化

一种可能是使用了不正确的JDBC URL。确保它是jdbc:h2:mem:testdb

您可以创建一个数据。在src/main/resources文件夹中的SQL文件,它将在启动时自动执行。在这个文件中,你可以添加一些插入语句,例如:

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

类似地,您可以创建一个模式。SQL文件(或schema-h2. SQL)来创建你的模式:

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

虽然通常情况下你不需要这样做,因为Spring引导已经配置Hibernate来基于你的实体为内存数据库创建模式。如果你真的想使用模式。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。SQL或data-mysql。SQL,这取决于您想使用的数据库平台。

要做到这一点,你必须配置数据源平台属性:

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