【问题标题】:The order of processes when starting the application启动应用程序时的进程顺序
【发布时间】:2021-05-16 02:28:52
【问题描述】:

我有一个关于在 Spring-Boot 中初始化数据的问题。 我有这个:

@PostConstruct
    public void run() {
        try {
            upload(path);
            logger.info("Seeding dictionary database...");
        } catch (IOException e) {
            //.....
        }
    }

run() 方法读取 .json 文件并在应用程序启动时使用文件中的信息填充数据库。但我也有一个 .sql 文件,它在启动时也会填充数据库。从 .sql 文件初始化创建的表与从 .json 文件创建的表相关

当应用启动时我有

INSERT INTO "USER_DICTIONARY"("DICTIONARY_ID", "USER_ID") VALUES (1, 0)

我的 import.sql 中有这一行,但这会导致错误,因为 DICTIONARY_ID 不存在 jet,因为它来自 import.sql 之后加载的 .json 文件 在执行sql文件时,需要从.json文件中检索到的数据才能正确映射该表。

是否可以在执行 .sql 文件之前执行我的 run() 方法,还是可以通过其他方式解决?如果是这样,请帮我找到答案。

【问题讨论】:

    标签: java spring spring-boot hibernate h2


    【解决方案1】:

    为数据库播种的一个选项是在 Spring Boot 中使用 CommandLineRunner。

    例子:

    @Component
    public class UserDataLoader implements CommandLineRunner {
    
    @Autowired
    UserRepository userRepository;
    
    @Override
    public void run(String... args) throws Exception {
        loadUserData();
    }
    
    private void loadUserData() {
        if (userRepository.count() == 0) {
            User user1 = new User("John", "Doe");
            User user2 = new User("John", "Cook");
            userRepository.save(user1);
            userRepository.save(user2);
        }
        System.out.println(userRepository.count());
    }
    

    }

    CommandRunner 界面将在应用程序启动后立即执行。

    另一种方法是使用@EventListener 来监听应用程序的 ContextRefreshEvent。

    例子:

    @Component
    public class DBSeed {
       @EventListener
       public void seed(ContextRefreshedEvent event) {
         try {
               upload(path);
               logger.info("Seeding dictionary database...");
           } catch (IOException e) {
               //.....
           }
        }
     }
    

    【讨论】:

    • 不幸的是,它不适用于 EventListener 或 COMmandLineRunner :/
    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多