Почему приложение Spring Boot 2.0 не запускает schema.sql?

Хотя я использовал Spring Boot 1.5, при запуске приложения Hibernate выполнил файл schema.sql, расположенный в папке /resources, когда установлена соответствующая конфигурация. После выпуска 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 или это ошибка/проблема?

Ответ 1

Проверьте документы здесь.

В приложении на основе JPA вы можете разрешить Hibernate создавать схему или использовать schema.sql, но вы не можете сделать и то, и другое. Обязательно отключите spring.jpa.hibernate.ddl-auto, если вы используете schema.sql.

У вас есть spring.jpa.hibernate.ddl-auto=create-drop, поэтому schema.sql не выполняется. Похоже, именно так работает Spring Boot.

редактировать

Я думаю, что проблема (на самом деле не проблема) заключается в том, что ваше приложение указывает на экземпляр mysql.

Смотрите текущие свойства Spring Boot:

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

Значение по умолчанию embedded - например, инициализировать, только если вы работаете и внедрили базу данных, например, H2.

Также смотрите ответ Стефана здесь. Он сказал:

Добавление spring.datasource.initialization-mode = всегда достаточно для вашего проекта.

Поэтому попробуйте установить:

spring.datasource.initialization-mode=always

Ответ 2

Не встроено (например, MySQL)

Если вы загружаете базу данных, которая не является встроенной, в Spring Boot 2 вам нужно добавить:

spring.datasource.initialization-mode=always

Проверьте руководство по миграции:

Инициализация базы данных

Базовая инициализация источника данных теперь включена только для встроенных источников данных и отключится, как только вы используете производственную базу данных. Новый 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 {

Ответ 3

Я смог запустить приложение только после исключения 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>

Пожалуйста, смотрите проблему здесь

Ответ 4

Он отлично работает для меня, вы можете попробовать. Установите тип источника данных на то, что вам нравится, а не на HikariCP.

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

Ответ 5

Возможно, возникла другая проблема: data.sql не может быть выполнен, если вы не spring.jpa.hibernate.ddl-auto=none, что data.sql не будет выполняться. D.