为啥 Spring Boot 2.0 应用程序不运行 schema.sql?

Posted

技术标签:

【中文标题】为啥 Spring Boot 2.0 应用程序不运行 schema.sql?【英文标题】:Why Spring Boot 2.0 application does not run schema.sql?为什么 Spring Boot 2.0 应用程序不运行 schema.sql? 【发布时间】:2018-09-01 11:20:45 【问题描述】:

当我使用 Spring Boot 1.5 时,在应用程序启动时,当设置了适当的配置时,Hibernate 会执行位于 /resources 文件夹中的 schema.sql 文件。在 Spring Boot 2.0 发布后,此功能不再起作用。我在文档中找不到有关此更改的任何信息。 这是我的 application.properties 文件内容:

spring.datasource.url=...
spring.datasource.username=...
spring.datasource.password=...

#spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.mysql5Dialect

Spring Boot 2.0 是否有一些变化或者这是一个错误/问题?

【问题讨论】:

我有同样的问题,下面没有答案解决它。有什么想法吗? 没有一个答案对我有帮助:(将 spring boot 升级到 2.x 后,db 停止自动更新/创建新表 【参考方案1】:

检查文档here。

在基于 JPA 的应用程序中,您可以选择让 Hibernate 创建模式 或使用 schema.sql,但你不能两者都做。确保禁用 spring.jpa.hibernate.ddl-auto 如果你使用 schema.sql。

你有spring.jpa.hibernate.ddl-auto=create-drop 这就是为什么schema.sql 没有被执行。 看起来这就是 Spring Boot 的工作方式。

编辑

我认为问题(不是真正的问题)是您的应用程序指向一个 mysql 实例。

见current Spring Boot properties:

spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts.

默认值为embedded - 例如仅当您正在运行和嵌入数据库时​​才进行初始化,例如 H2。

另见 Stephan here 的回答。他说:

将 spring.datasource.initialization-mode=always 添加到您的项目是 够了。

所以尝试设置:

spring.datasource.initialization-mode=always

【讨论】:

对不起,我的错。即使使用spring.jpa.hibernate.ddl-auto=none 这也不起作用。我刚刚编辑了原始帖子。 它在 Spring 2.0 之前有效,我不知道为什么不再有效,但我也在寻找答案。我只需要在schema.sql 中为h2 创建一个架构,因为我已经升级到2.0 它停止工作了。 @11thdimension 看起来新的主要 Spring Boot 版本不支持它。如果我们能在文档中找到它,那就太好了。 我已经试过了,还是不行。但是,在我排除了添加到 Spring Boot 2 的 HikariCP 依赖项后,它得到了解决。 @EvgeniDimitrov 答案是正确的,但在我的情况下,它进入了一些依赖循环循环,如显示here【参考方案2】:

未嵌入(例如 MySQL)

如果你加载了一个未嵌入的数据库,在 Spring Boot 2 中你需要添加:

spring.datasource.initialization-mode=always

查看Migration Guide:

数据库初始化

现在仅对嵌入数据启用基本数据源初始化 来源,并会在您使用作品时立即关闭 数据库。新的spring.datasource.initialization-mode(替换 spring.datasource.initialize) 提供更多控制权。


嵌入式(例如 h2)

我曾经遇到过类似的问题,即使它是一个 h2(所以它一个嵌入式数据库),我的 h2 配置是由 my-test 配置文件激活的。

我的测试课是这样的:

@RunWith(SpringRunner.class)
@SpringBootTest                     // does not work alone
@ActiveProfiles("my-test")
public class MyEntityRepositoryTest 

问题是@SpringBootTest单独没有初始化测试数据库。我不得不使用@DataJpaTest@SpringBootTest+@AutoConfigureTestDatabase。例子

@RunWith(SpringRunner.class)
@DataJpaTest                       // works
@ActiveProfiles("sep-test")
public class MyEntityRepositoryTest 

@RunWith(SpringRunner.class)
@SpringBootTest                     // these two
@AutoConfigureTestDatabase          // together work
@ActiveProfiles("sep-test")
public class MyEntityRepositoryTest 

【讨论】:

【参考方案3】:

对我来说很好用,你可以试试。将数据源类型设置为您喜欢的类型,而不是 HikariCP。

spring.datasource.initialization-mode=always
spring.datasource.type=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.jpa.hibernate.ddl-auto=none

【讨论】:

【参考方案4】:

还有一个问题可能导致data.sql无法执行,当你不配置spring.jpa.hibernate.ddl-auto=none时,data.sql将不会被执行。

【讨论】:

【参考方案5】:

我只有在像这样排除 Hikary CP 后才能使应用程序运行:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

请看问题here

【讨论】:

以上是关于为啥 Spring Boot 2.0 应用程序不运行 schema.sql?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.0干货系列:Spring Boot1.5X升级到2.0指南

Spring boot 2.0 - 为用户配置

Spring Boot 和 SAML 2.0

Spring Boot 2.0 热部署指南

Spring Boot 2.0 整合Thymeleaf 模板引擎

spring-boot2.0 单元测试JUnit4