web-dev-qa-db-ja.com

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に何らかの変更がありますか、それともバグ/問題ですか?

21
Đorđe Pržulj

ドキュメントを確認してください こちら

JPAベースのアプリでは、Hibernateにスキーマを作成させるかschema.sqlを使用させるかを選択できますが、両方を行うことはできません。 schema.sqlを使用する場合は、spring.jpa.hibernate.ddl-autoを必ず無効にしてください。

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などの埋め込みデータベースを実行している場合にのみ初期化します。

また、Stephan here の回答もご覧ください。彼は言った:

Spring.datasource.initialization-mode = alwaysをプロジェクトに追加するだけで十分です。

だから設定してみてください:

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

埋め込まれていない(例:MySQL)

not embeddedであるデータベースをロードする場合、Spring Boot 2で以下を追加する必要があります。

spring.datasource.initialization-mode=always

移行ガイド を確認してください:

データベースの初期化

基本的なデータソースの初期化は、埋め込みデータソースに対してのみ有効になり、運用データベースを使用するとすぐにオフになります。新しいspring.datasource.initialization-modespring.datasource.initializeを置き換える)は、より多くの制御を提供します。


埋め込み(例:h2)

H2であったにもかかわらずwas組み込みDBであったにもかかわらず、私はかつて同様の問題を抱えていました。私のh2構成はmy-testプロファイル。

私のテストクラスは次のようなものでした:

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

問題は@SpringBootTestだけdがテストデータベースを初期化していないことです@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 {
12
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>

問題をご覧ください こちら

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

spring.jpa.hibernate.ddl-auto=noneを設定しないと、data.sqlが実行されないというdata.sqlを実行できないという別の問題があります。

0
jay chang