如何解决启动应用程序时的进程顺序
我有一个关于在 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() 方法,或者可以通过其他方式解决?如果是这样,请帮我找到答案。
解决方法
为数据库做种的一种选择是在 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) {
//.....
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。