我正在将现有的Sping Boot 2.1.x
应用程序迁移到2.6.x
。我想要以下行为(对于使用嵌入式H2数据库的集成测试),这在2.1.x
中工作正常(显然),但我正在努力在2.6.x
中实现相同的行为。
1.自动创建MySQL(无需任何自定义SQL脚本)
1.执行自定义DML(data.sql)
1.初始化实现InitializingBean
的bean,并使用步骤#2中填充的数据。缓存数据库表记录供应用程序以后使用
问题#1(已解决)
默认情况下,2.6.x
不再自动创建。因此,添加下面的属性显式似乎是解决方案。
spring.jpa.generate-ddl = true
spring.jpa.hibernate.ddl-auto = create-drop
这解决了 * 步骤#1* 与2.6.x
。
问题#2(已解决)
从2.5
,Boot was running scripts in data.sql
before Hibernate is initialized开始。data.sql
失败了。要使 Boot 等待磁盘创建完成,添加下面的属性似乎是解决方案。
spring.jpa.defer-datasource-initialization = true
这解决了 * 步骤#2与2.6.x
。
问题#3(需要解决)
似乎是因为将spring.jpa.defer-datasource-initialization
设置为true
,步骤#3发生在步骤#2之前,即在2.6.x
中。这会导致bean使用空的数据库表进行初始化,例如。缓存中未填充任何条目。它们导致我的测试失败。
我使用了spring.jpa.defer-datasource-initialization
、spring.data.jpa.repositories.bootstrap-mode
和spring.sql.init.mode
等属性来解决这个问题,但没有任何运气。
2条答案
按热度按时间8yoxcaq71#
您可以使用
@DependsOnDatabaseInitialization
注解InitializingBean
(或生成它的@Bean
方法)。只有在数据库初始化完成之后,才会创建或初始化bean。在幕后,注解将允许bean工厂被配置为使
InitializingBean
依赖于任何DataSourceScriptDatabaseInitializer
,特别是执行data.sql
的那个。在官方参考文档中有更多关于这方面的信息:https://docs.spring.io/spring-boot/docs/2.7.15/reference/html/howto.html#howto.data-initialization.dependencies.depends-on-initialization-detection
axzmvihb2#
您可以通过使用
ApplicationRunner
或CommandLineRunner
将执行这些InitializingBean
的逻辑推迟到spring上下文完成启动之后。此时,所有bean的初始化、引导休眠和执行data.sql
都应该已经完成了。Something like:
最终结果与使用
InitializingBean
方法相同(即,应用程序启动后,DB记录将缓存在该Bean中)