hibernate Sping Boot 从2.1迁移到2.5/2.6-SQL Script DataSource出现问题

eh57zj3b  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(89)

我正在将现有的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.5Boot 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-initializationspring.data.jpa.repositories.bootstrap-modespring.sql.init.mode等属性来解决这个问题,但没有任何运气。

8yoxcaq7

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

axzmvihb

axzmvihb2#

您可以通过使用ApplicationRunnerCommandLineRunner将执行这些InitializingBean的逻辑推迟到spring上下文完成启动之后。此时,所有bean的初始化、引导休眠和执行data.sql都应该已经完成了。
Something like:

@Service
public class FooService implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //cache database table records for later use...
    }
}

最终结果与使用InitializingBean方法相同(即,应用程序启动后,DB记录将缓存在该Bean中)

相关问题