为什么Spring Boot 2.0应用程序不运行架构.sql?未嵌入(例如 MySQL)数据库初始化嵌入式(例如 h2)

2022-09-01 02:51:46

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

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


答案 1

查看此处的文档。

在基于 JPA 的应用中,您可以选择让 Hibernate 创建架构或使用架构.sql,但不能同时执行这两项操作。如果您使用 schema.sql,请确保禁用 spring.jpa.hibernate.ddl-auto。

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

编辑

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

查看当前的弹簧靴属性

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

默认值为 - 例如,仅在运行和嵌入式数据库(如H2)时才初始化。embedded

另请参阅斯蒂芬的答案 请点击此处。.他说:

将 spring.datasource.initialization-mode=always 添加到项目中就足够了。

所以试着设置:

spring.datasource.initialization-mode=always

答案 2

未嵌入(例如 MySQL)

如果装入未嵌入的数据库,则需要在 Spring Boot 2 中添加:

spring.datasource.initialization-mode=always

查看迁移指南

数据库初始化

基本数据源初始化现在仅对嵌入数据源启用,并且在使用生产数据库时会立即关闭。新的(替换)提供了更多的控制。spring.datasource.initialization-modespring.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 {

推荐