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