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

时间:2018-03-22 21:09:32

标签: java spring hibernate spring-boot

当我使用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是否有一些变化,或者这是一个错误/问题?

5 个答案:

答案 0 :(得分:16)

检查文件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

答案 1 :(得分:11)

未嵌入(例如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 {

答案 2 :(得分:1)

只有在排除了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>

请在这里查看问题:https://github.com/spring-cloud/spring-cloud-security/issues/143

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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