it-swarm.com.ru

Почему приложение 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 или это ошибка/проблема?

13
Đorđe Pržulj

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

В приложении на основе 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
11
Evgeni Dimitrov

Не встроен (например, 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 {
6
acdcjunior

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

Пожалуйста, посмотрите проблему здесь: https://github.com/spring-cloud/spring-cloud-security/issues/143

1
stinger

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

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

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

0
jay chang