web-dev-qa-db-fra.com

Pourquoi l'application Spring Boot 2.0 n'exécute-t-elle pas schema.sql?

Alors que j'utilisais Spring Boot 1.5, au démarrage de l'application, Hibernate exécutait le fichier schema.sql situé dans le dossier/resources lorsque la configuration appropriée était définie. Après Spring Boot 2.0, cette fonctionnalité ne fonctionne plus. Je n'ai rien trouvé à propos de cette modification dans la documentation . Voici le contenu de mon application.properties file:

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

Y at-il des changements dans Spring Boot 2.0 ou s’agit-il d’un bogue ou d’un problème?

13
Đorđe Pržulj

Vérifiez les documents ici

Dans une application basée sur JPA, vous pouvez choisir de laisser Hibernate créer le schéma ou utilisez schema.sql, mais vous ne pouvez pas faire les deux. Assurez-vous de désactiver spring.jpa.hibernate.ddl-auto si vous utilisez schema.sql.

Vous avez spring.jpa.hibernate.ddl-auto=create-drop c'est pourquoi schema.sql n'est pas exécuté .

Modifier

Je pense que le problème (pas vraiment un problème) est que votre application pointe vers une instance de mysql. 

Voir les propriétés actuelles de Spring Boot :

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

La valeur par défaut est embedded - par ex. initialisez uniquement si vous utilisez une base de données intégrée, telle que H2.

Voir aussi la réponse de Stephan ici . Il a dit:

L'ajout de spring.datasource.initialization-mode = toujours à votre projet est assez.

Alors essayez de définir:

spring.datasource.initialization-mode=always
11
Evgeni Dimitrov

Non intégré (par exemple, MySQL)

Si vous chargez une base de données non incorporée, vous devez ajouter dans Spring Boot 2:

spring.datasource.initialization-mode=always

Consultez le Guide de migration :

Initialisation de la base de données

L’initialisation de base de la source de données n’est plus activée que pour les données incorporées sources et s’éteindra dès que vous utiliserez une production base de données. Le nouveau spring.datasource.initialization-mode (remplaçant spring.datasource.initialize) offre plus de contrôle.


Embarqué (par exemple h2)

Un jour, j’ai eu un problème similaire, même s’il s’agissait d’un h2 (donc était une base de données intégrée), ma configuration h2 a été activée par un profil my-test.

Ma classe de test était comme:

@RunWith(SpringRunner.class)
@SpringBootTest                     // does not work alone
@ActiveProfiles("my-test")
public class MyEntityRepositoryTest {

Le problème est @SpringBootTest seul n'a pas initialisé la base de données de test. Je devais soit utiliser @DataJpaTest ou @SpringBootTest + @AutoConfigureTestDatabase. Exemples

@RunWith(SpringRunner.class)
@DataJpaTest                       // works
@ActiveProfiles("sep-test")
public class MyEntityRepositoryTest {

ou

@RunWith(SpringRunner.class)
@SpringBootTest                     // these two
@AutoConfigureTestDatabase          // together work
@ActiveProfiles("sep-test")
public class MyEntityRepositoryTest {
6
acdcjunior

Je n'ai pu exécuter l'application qu'après avoir exclu Hikary CP comme ça:

<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>

Voir le numéro ici: https://github.com/spring-cloud/spring-cloud-security/issues/143

1
stinger

Cela fonctionne bien pour moi, vous pouvez l'essayer. Définissez le type de source de données à votre guise au lieu de HikariCP.

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

Un autre problème peut avoir pour résultat que data.sql ne peut pas être exécuté. Lorsque vous ne configurez pas le spring.jpa.hibernate.ddl-auto=none, le data.sql ne sera pas exécuté d.

0
jay chang