java—启动应用程序时的进程顺序

vsmadaxz  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(286)

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

@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\u id不存在,因为它来自import.sql之后加载的.json文件。在执行sql文件时,需要从.json文件检索的数据来正确Map此表。
是否可以在执行.sql文件之前执行my run()methody,或者可以用其他方法解决?如果是,请帮我找到答案。

6ie5vjzr

6ie5vjzr1#

在springboot中使用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) {
           //.....
       }
    }
 }

相关问题