webentwicklung-frage-antwort-db.com.de

Warum führt Spring Boot 2.0-Anwendung schema.sql nicht aus?

Während ich Spring Boot 1.5 verwendete, führte Hibernate beim Start der Anwendung die Datei schema.sql aus, die sich im Ordner / resources befindet, wenn die entsprechende Konfiguration festgelegt ist. Nach der Spring Boot 2.0-Version funktioniert diese Funktion nicht mehr. Ich konnte nichts über diese Änderung in der Dokumentation finden ... Hier ist mein Inhalt der Datei 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

Gibt es eine Änderung in Spring Boot 2.0 oder ist dies ein Fehler?

13
Đorđe Pržulj

Überprüfen Sie die Dokumente hier

In einer JPA-basierten App können Sie festlegen, dass der Ruhezustand das Schema .__ erstellt. oder verwenden Sie schema.sql, aber Sie können nicht beides tun. Stellen Sie sicher, dass .__ deaktiviert ist. spring.jpa.hibernate.ddl-auto, wenn Sie schema.sql verwenden.

Sie haben spring.jpa.hibernate.ddl-auto=create-drop, weshalb schema.sql nicht ausgeführt wird . Anscheinend funktioniert Spring Boot so.

Bearbeiten

Ich denke, das Problem (nicht wirklich ein Problem) ist, dass Ihre Anwendung auf eine Mysql-Instanz verweist. 

Siehe - aktuelle Spring Boot-Eigenschaften :

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

Der Standardwert ist embedded - z. initialisieren Sie nur, wenn Sie eine eingebettete Datenbank wie H2 ausführen.

Siehe auch die Antwort von Stephan hier . Er sagte:

Das Hinzufügen von spring.datasource.initialization-mode = immer zu Ihrem Projekt ist genug.

Also versuche zu setzen:

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

Nicht eingebettet (z. B. MySQL)

Wenn Sie eine Datenbank laden, die nicht eingebettet ist , müssen Sie in Spring Boot 2 Folgendes hinzufügen:

spring.datasource.initialization-mode=always

Überprüfen Sie das Migrationshandbuch :

Datenbankinitialisierung

Die grundlegende DataSource-Initialisierung ist jetzt nur für eingebettete Datenquellen aktiviert und wird deaktiviert, sobald Sie eine Produktionsdatenbank verwenden. Das neue spring.datasource.initialization-mode (ersetzt spring.datasource.initialize) bietet mehr Kontrolle.


Eingebettet (z. B. h2)

Ich hatte einmal ein ähnliches Problem, obwohl es ein h2 war (also ein eingebetteter DB), meine h2 Konfiguration wurde durch ein my-test Profil.

Meine Testklasse war wie folgt:

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

Das Problem ist @SpringBootTest allein hat die Testdatenbank nicht initialisiert . Ich musste entweder @DataJpaTest oder @SpringBootTest + @AutoConfigureTestDatabase. Beispiele

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

oder

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

Ich konnte die Anwendung erst nach dem Ausschluss von Hikary CP so ausführen:

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

Bitte lesen Sie die Ausgabe hier: https://github.com/spring-cloud/spring-cloud-security/issues/143

1
stinger

Es funktioniert gut für mich, du kannst es versuchen. Setzen Sie den Datenquellentyp auf den gewünschten Wert anstelle von HikariCP.

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

Ein anderes Problem kann dazu führen, dass data.sql nicht ausgeführt werden kann, wenn Sie den spring.jpa.hibernate.ddl-auto=none nicht konfigurieren, dass data.sql nicht ausgeführt wird.

0
jay chang