Posted at

JavaEEでFlywayを使う


はじめに

FlywayとはJava用に開発されたDBマイグレーションツールです。

DBマイグレーションとは、簡単に言えば、DBのバージョン管理ですね。

DBマイグレーションツールを使わない場合、環境によってDB構成に差異が生じて、アプリケーションの動作にも影響してきます。flywayを使うことで、DB変更によるアプリケーション障害の影響は減らせると思います。


今までどうやっていたか

マイグレーションツールがなかった時代は、A5M2やERMasterなどのER図作成ツールを使い、DDL出力しDBを作成していました。構成に変更があったときは、ER図を更新し、更新用のDDLをExcelなどで管理していました。

以前、Playframeworkという、Java、Scalaのフレームワークを使っていた時があったのですが、

エンティティクラスを変更するだけで、フレームワークがDBとの差異を検知し、自動で更新してくれていました。

今回お話するJavaEEにはそのような機能はないので、Flywayを使うことになります。

flywayを調べると、SpringBootとの連携の記事が多く、JavaEE連携の記事が少ないように思いましたので、使い方を残すことにしました。


対象


  • JavaEE7

  • NetBeans8.2

  • Flyway5.2.4

  • PostgreSQL9.6


準備

MavenでWebアプリケーションプロジェクトを作成します。(Webでなくても問題ないです。)

pom.xmlを以下のように編集します。


pom.xml

・・・

<dependencies>
    ・・・
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1206-jdbc41</version>
    </dependency>
</dependencies>

<plugins>
    ・・・
    <plugin>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-maven-plugin</artifactId>
        <version>5.2.4</version>
        <configuration>
            <url>jdbc:postgresql://<ホスト名>:<ポート>/flywaydb</url>
            <user><ユーザ名></user>
            <password><パスワード></password>
        </configuration>
    </plugin>
</plugins>


src/main/resources/db/migrationに以下のファイルを作成します。

作成するファイルには命名規則があるので注意が必要です。


V__ + (バージョン番号) + (任意の名前) + .sql

__はアンダースコアが2つです。


V1__create_user.sql

create table users (

id int not null,
name varchar(100) not null
);


実行

$ cd <プロジェクトのルート>

$ mvn flyway:migrate

DB構成に変更があった場合は、命名規則に従ってsqlファイルを作成します。


NetBeanとの連携

アプリケーションの実行やデバッグを行う場合、IDEの機能を利用することが多いと思います。

現状、マイグレーションをコマンドで個別に実行する必要があるので、NetBeansと連携したみたいと思います。

プロジェクトを右クリック->[プロパティ]を開きます。

カテゴリの[アクション]を開きます。

使っている構成(通常はデフォルト構成)を選択します。

[プロジェクトのビルド]を選択し、[ゴールの実行]の設定値を以下のように変更します。

(変更前) install

(変更後) flyway:migrate install

設定が完了したら、[OK]ボタンでプロパティ画面を閉じます。


連携を確認

プロジェクトを右クリック->[ビルド]を実行します。

--- flyway-maven-plugin:5.2.4:migrate (default-cli) @ flyway-javaee ---

Flyway Community Edition 5.2.4 by Boxfuse
Database: jdbc:postgresql://localhost:25432/flywaydb (PostgreSQL 9.6)
Successfully validated 1 migration (execution time 00:00.066s)
Current version of schema "public": 1
Schema "public" is up to date. No migration necessary.

上記のログが出力されれば成功です。


参考サイト