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

9q78igpj  于 2023-05-27  发布在  Java
关注(0)|答案(6)|浏览(256)

当我使用Sping Boot 1.5时,当设置了适当的配置时,在应用程序启动时,Hibernate执行位于 /resources 文件夹中的 schema.sql 文件。Sping 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

Sping Boot 2.0中是否有一些变化,或者这是一个bug/问题?

h5qlskok

h5qlskok1#

检查这里的文件。
在基于JPA的应用程序中,您可以选择让Hibernate创建schema或使用schema.sql,但不能两者都做。如果使用schema.sql,请确保禁用spring.jpa.hibernate.ddl-auto。
你有spring.jpa.hibernate.ddl-auto=create-drop,这就是为什么schema.sql没有被执行。看起来这就是Sping 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
btqmn9zl

btqmn9zl2#

未嵌入(例如MySQL)

如果加载的是非嵌入式的数据库,在Sping Boot 2中需要添加:

spring.datasource.initialization-mode=always

查看迁移指南:

数据库初始化

基本数据源初始化现在仅对嵌入式数据源启用,并且在使用生产数据库时将立即关闭。新的spring.datasource.initialization-mode(取代spring.datasource.initialize)提供了更多的控制。

嵌入式(如h2)

我曾经遇到过类似的问题,尽管它是一个h2(所以它是一个嵌入式DB),我的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 {
8ljdwjyq

8ljdwjyq3#

最近更新

自Sping Boot 版本2.7
属性spring.datasource.initialization-mode已被删除。
从这个版本开始,您应该使用替换属性spring.sql.init.mode
示例:spring.sql.init.mode:always
Spring Boot 2.7 changelog

6ju8rftf

6ju8rftf4#

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

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

qacovj5a5#

可能还有其他问题导致data.sql无法执行,如果您不配置spring.jpa.hibernate.ddl-auto=none,data.sql将无法执行。

83qze16e

83qze16e6#

我只能在排除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

相关问题