Flywayを使用してSpringBootアプリケーションの組み込みH2データベースで移行デモを作成しようとしています。
application.properties
logging.level.org.org.springframework=DEBUG
server.port=8181
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.flyway.baseline-on-migrate=true
spring.jpa.hibernate.ddl-auto=none
db/migrationの下のmigration-script(V2__create_shipwreck.sql)
CREATE TABLE SHIPWRECK(ID INT AUTO_INCREMENT,
NAME VARCHAR(255),
DESCRIPTION VARCHAR(2000),
CONDITION VARCHAR(255),
DEPTH INT,
LATITUDE DOUBLE,
LANGITUDE DOUBLE,
YEARS_DISCOERED INT);
コンソールログ
INFO 7284 --- [main] o.f.c.internal.database.DatabaseFactory:データベース:jdbc:h2:mem:testdb(H2 1.4)
INFO 7284 --- [main] o.f.core.internal.command.DbValidate:1回の移行が正常に検証されました(実行時間00:00.031s)
INFO 7284 --- [main] o.f.c.i.s.JdbcTableSchemaHistory:スキーマ履歴テーブルの作成: "PUBLIC"。 "flyway_schema_history"
INFO 7284 --- [main] o.f.core.internal.command.DbMigrate:スキーマ "PUBLIC"の現在のバージョン:<<空のスキーマ>>
INFO 7284 --- [main] o.f.core.internal.command.DbMigrate:スキーマ「PUBLIC」をバージョン2に移行しています-難破船を作成します
INFO 7284 --- [main] o.f.core.internal.command.DbMigrate:スキーマ "PUBLIC"に1つの移行を正常に適用しました(実行時間00:00.098s)
INFO 7284 --- [main] j.LocalContainerEntityManagerFactoryBean:永続ユニット 'default'のJPAコンテナEntityManagerFactoryを構築しています
INFO 7284 --- [main] o.hibernate.jpa.internal.util.LogHelper:HHH000204:PersistenceUnitInfoを処理しています[名前:デフォルト...]
main] org.hibernate.Version:HHH000412:Hibernate Core {5.2.14.Final}
main] org.hibernate.cfg.Environment:HHH000206:hibernate.propertiesが見つかりません
main] o.hibernate.annotations.common.Version:HCANN000001:Hibernate Commons Annotations {5.0.1.Final}
main] org.hibernate.dialect.Dialect:HHH000400:方言の使用:org.hibernate.dialect.H2Dialect
main] j.LocalContainerEntityManagerFactoryBean:永続性ユニットの初期化されたJPAEntityManagerFactory「デフォルト」
pom.xml
<project xmlns="http://maven.Apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>das-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>das-boot</name>
<url>http://maven.Apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
H2データベーステーブルUI
Spring Bootアプリケーションを起動した後、テーブルが作成されていないので、ここでの問題は何ですか?
あなたの説明に基づくと(Flywayは正しく実行されますが、その後スキーマの変更は観察されません)、これはSpringBootがH2の変更を永続化しないように聞こえます。 この質問 のように、JPA構成がFlyway移行後のスキーマ変更を上書きしないように、spring.jpa.hibernate.ddl-auto=none
をapplication.properties
に追加しようとする場合があります。
同じ問題が発生しました。application.propertiesをdatasource.urlとしてmemではなくfileに変更した後、解決されました。
詳細を含むテーブルを作成できる正解:spring.datasource.url=jdbc:h2:file:~/dasboot
application.properties
logging.level.org.org.springframework=DEBUG
server.port=8080
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:file:~/dasboot
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.flyway.baseline-on-migrate=true
spring.jpa.hibernate.ddl-auto=none
POM.xml
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boot</groupId>
<artifactId>das-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<name>das-boot</name>
<url>http://maven.Apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>