Почему приложение 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.