S2JDBC-Gen - S2JDBC-Genとは

S2JDBC-Genとは、S2JDBCを使った開発をサポートするツールです。 J2JDBC-Genは、保守・運用といったフェーズではなく開発のフェーズを対象としています。 S2JDBC-Genを利用することで、データベーススキーマの修正をJavaのエンティティクラスに反映させるといったこれまでの開発スタイルではなく、 エンティティクラスの修正をデータベーススキーマに反映させるといった新しい開発スタイルが可能になります。

S2JDBC-Genは、Javaのコード修正によるデータベースリファクタリングを実現します。

主な機能には次のようなものがあります。

  1. データベースからエンティティクラスのJavaコードを生成する機能
  2. エンティティクラスからDDL(Data Definition Language)スクリプトとCSV形式のダンプデータを生成し、バージョン管理する機能
  3. バージョン管理されたDDLスクリプトとダンプファイルを使用してデータベーススキーマをマイグレーションする機能
S2JDBC-Gen概要

「データベースからエンティティクラスのJavaコードを生成する機能」は最初に一度だけ行われる初期インポートに相当します。 エンティティの生成後は、エンティティを直接修正してDDLを生成し、DDLとデータをデータベースに適用するというプロセスを繰り返すことができます。

S2JDBC-Genの様々な機能は、Apache Antを使って起動できるようになっています。 セットアップの方法はセットアップを参照ください。 S2JDBC-Genが提供するAntタスクについてはタスク一覧を参照ください。

ダウンロードはダウンロードのページから行ってください。

EclipseプラグインのDoltengを使う場合は、Doltengにより必要なjarファイルを用意できるのでダウンロードは不要です。 DoltengについてはDoltengの利用を参照してください。

テーブルに対応するエンティティクラスのJavaコードを生成できます。 外部キーが存在する場合は、クラスの関連付けも行います。

たとえば、次のDDLで表されるDEPARTMENTテーブルとEMPLOYEEテーブルがデータベース上に存在するとします。

S2JDBC-Genはデータベース上のテーブルの定義から次のような2つのエンティティクラスのJavaコードを生成できます。

employeeList; }]]>

詳しくは、Gen-Entityタスクを参照ください。

エンティティクラスからDDLスクリプトを生成できます。 サポートしているデータベースオブジェクトは次の通りです。

  • テーブル(主キー、NOT NULL制約、デフォルト値等の定義も含む)
  • IDの採番用のシーケンス(使用するデータベースがシーケンスをサポートし、IDの採番をシーケンスを使って行う場合)
  • 一意キー
  • 外部キー

たとえば、データベースHSQLDBを使用している場合、上で示したEmployeeクラスからは次のようなスクリプトが出力されます。

データベースオブジェクト作成用のDDLスクリプトだけでなく削除用のDDLスクリプトも合わせて生成されます。 生成されたDDLスクリプトはS2GDBC-Genによりバージョン管理されます。

上に挙げたもの以外のデータベースオブジェクト(ビュー、トリガー、ストアドプロシージャーなど)は、S2JDBC-Genによって生成はされませんが、 これらのDDLスクリプトを別途作成して特定のディレクトリに格納すれば、S2JDBC-Genの管理下に置くことができます。

S2JDBC-GenはDDL生成時にデータベースのデータをCSV形式でダンプ出力できます。 この機能を利用すると、DDLスクリプトとDDLスクリプトに対応したデータを一緒に管理できます。

詳しくは、Gen-DdlタスクやDDL生成のためのエンティティ定義を参照ください。

バージョン管理されたDDLを使用して、データベーススキーマの再作成を実行できます。 新しいデータベーススキーマの作成後、バージョン管理されたCSV形式のデータを自動でロードすることもできます。

マイグレーションの大まかな処理の流れは次の通りです。

  1. 古いバージョンのデータベーススキーマを削除する。
  2. 新しいバージョンのデータベーススキーマを作成する。
  3. 新しいバージョンのデータをロードする。
  4. 新しいバージョンのデータベーススキーマに外部キーを適用する。

独自のDDLスクリプトを作成し、S2JDBC-Genの管理下においておけば、 そのスクリプトの実行は上記の処理の中に組み込むことができます。

Subversionなどのソースコード管理ツールでDDLスクリプトとデータを管理しておくと、 マイグレーション機能と組み合わせて複数のPCで動作している開発用データベースを簡単に同期させられます。

詳しくは、Migrateタスクを参照ください。

S2JDBC-Genを効果的に利用するには、S2JDBC-Genに適した開発スタイルと開発環境が重要です。

S2JDBC-Genに適した開発スタイルとは、上記で説明したようにDDLの生成とマイグレーションを何度も繰り返すような開発スタイルです (すでにデータベーススキーマが存在するときのみ、エンティティクラスをデータベーススキーマから生成します)。 エンティティクラスへの修正をデータベーススキーマに反映させるため、Javaコード中心の開発スタイルと言えます。 この開発スタイルでは、エンティティクラスや依存する他のクラスの修正を、EclipseなどのIDEのリファクタリング機能を利用して行えるというメリットがあります。

逆に、S2JDBC-Genに適さない開発スタイルとは、データベーススキーマの修正のたびにデータベーススキーマからエンティティクラスを生成しなおす開発スタイルです。 これは、データベーススキーマ中心の開発スタイルと言えます。 この開発スタイルでは、データベースから自動生成する部分と、手動で変更を加える部分を分離するGeneration Gapパターンの利用が一般的です。 しかし、S2JDBC-Genでは、データベースからのエンティティクラスの生成は最初の一度だけのみ行うことを想定しているためGeneration Gapパターンは採用していません。 S2JDBC-Genでは、直接修正しやすいシンプルなコードを生成します。 データベーススキーマ中心の開発スタイルを採用する場合は、S2JDBCとS2JDBC-Genの組み合わせよりも、DBFluteの利用を検討してみてはいかがでしょうか。

S2JDBC-Genを使った開発では、次の環境が前提となります。

  • データベースは開発者ごとに用意する
  • Subversionなどのバージョン管理ツールを利用してソースコードを管理する

データベースを開発者ごとに用意するのは、データベーススキーマの修正作業が他の開発者の作業を妨げないようにするためです。

ある環境で、データベーススキーマの修正が正しく動作することを確認できたら、Javaソースコード、DDL、ダンプデータを他の開発者と共有する必要があります。 その共有にバージョン管理ツールを利用します。 バージョン管理ツールを利用することで、開発のどの段階であってもJavaのクラスとデータベーススキーマの一貫性を保つことができます。

S2JDBC-Genでは次のデータベースに対応しています。

ここに挙げた以外のデータベースについてもできる限り動作するように試みていますが、完全には動作しない可能性が高いです。 必要であれば対応しますので、どのように動作しないか情報提供をメーリングリストまでお願いします。