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?
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
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çantspring.datasource.initialize
) offre plus de contrôle.
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 {
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
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
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.