Java 为什么Spring Boot 2.0应用程序不运行schema.sql?

Java 为什么Spring Boot 2.0应用程序不运行schema.sql?,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,当我使用Spring Boot 1.5时,在应用程序启动时,Hibernate执行位于/resources文件夹中的schema.sql文件,并设置了相应的配置。在SpringBoot2.0发布后,此功能不再工作。我在文档中找不到有关此更改的任何信息。 以下是我的application.properties文件内容: spring.datasource.url=... spring.datasource.username=... spring.datasource.password=... #

当我使用Spring Boot 1.5时,在应用程序启动时,Hibernate执行位于/resources文件夹中的schema.sql文件,并设置了相应的配置。在SpringBoot2.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是否有一些变化,或者这是一个错误/问题?

检查文档

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

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

编辑

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

见:

默认值为
embedded
——例如,只有在运行嵌入式数据库时才初始化,如H2

另见Stephan的答案。他说,

将spring.datasource.initialization mode=始终添加到项目中是不正确的 够了

因此,尝试设置:

spring.datasource.initialization-mode=always
未嵌入(例如MySQL) 如果加载未嵌入的数据库,则在Spring Boot 2中需要添加:

spring.datasource.initialization-mode=always
检查:

数据库初始化 基本数据源初始化现在仅对嵌入数据启用 源,并将在您使用产品时立即关闭 数据库新的
spring.datasource.initialization模式
(替换
spring.datasource.initialize
)提供了更多的控制


嵌入式(如h2) 我曾经遇到过类似的问题,尽管它是h2(因此它是嵌入式DB),但我的h2配置是由我的测试配置文件激活的

我的测试课是这样的:

@RunWith(SpringRunner.class)
@SpringBootTest                     // does not work alone
@ActiveProfiles("my-test")
public class MyEntityRepositoryTest {
问题是
@SpringBootTest
单独没有初始化测试数据库。我必须使用
@DataJpaTest
@springbootest
+
@AutoConfigureTestDatabase
。例子

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


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

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

还有一个问题可能导致data.sql无法执行,当您不配置
spring.jpa.hibernate.ddl auto=none
时,data.sql将不会执行。我只能在排除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>

org.springframework.boot

对不起,是我的错。即使使用
spring.jpa.hibernate.ddl auto=none
这也不起作用。我刚刚编辑了一篇原创文章。它在Spring2.0之前就可以工作了,我不知道为什么它不再有效了,但我也在寻找答案。我只需要在
schema.sql
中为
h2
创建一个架构,因为我已经升级到2.0,它停止工作。@11thdimension看起来新的主要Spring启动版本不支持它。如果我们能在文档中找到它,那就太好了。我已经试过了,但还是不起作用。但是,在我排除了添加到Spring Boot 2的HikariCP依赖项之后,它得到了解决。@EvgeniDimitrov答案是正确的,但在我的例子中,它进入了依赖项循环,这表明我有相同的问题,下面没有答案解决了它。有什么想法吗?没有一个答案对我有帮助:(将spring boot升级到2.x后,db停止自动更新/创建新表
spring.datasource.initialization-mode=always
spring.datasource.type=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.jpa.hibernate.ddl-auto=none
<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>