概要
S2JDBC-Genとは、S2JDBC を使った開発をサポートするツールです。 S2JDBC-Genは、データベーススキーマの修正をJavaのエンティティクラスに反映させるといった開発スタイルではなく、 エンティティクラスの修正をデータベーススキーマに反映させるといった開発スタイルを可能にします。
主な機能には次のようなものがあります。
- データベースからエンティティクラスのJavaコードを生成する機能
- エンティティクラスからDDL(Data Definition Language)スクリプトとCSV形式のダンプデータを生成し、バージョン管理する機能
- バージョン管理されたDDLスクリプトとダンプファイルを使用してデータベーススキーマをマイグレーションする機能

「データベースからエンティティクラスのJavaコードを生成する機能」は最初に一度だけ行われる初期インポートに相当します。 エンティティの生成後は、エンティティを直接修正してDDLを生成し、DDLとデータをデータベースに適用するというプロセスを繰り返すことができます。
S2JDBC-Genの様々な機能は、Apache Ant を使って起動できるようになっています。 セットアップの方法はセットアップ を参照ください。 S2JDBC-Genが提供するAntタスクについてはタスク一覧 を参照ください。
エンティティクラスの生成
テーブルに対応するエンティティクラスのJavaコードを生成できます。 外部キーが存在する場合は、クラスの関連付けも行います。
たとえば、次のDDLで表されるDEPARTMENTテーブルとEMPLOYEEテーブルがデータベース上に存在するとします。
create table DEPARTMENT ( DEPARTMENT_ID integer not null primary key, DEPARTMENT_NAME varchar(20) ); create table EMPLOYEE ( EMPLOYEE_ID integer not null primary key, EMPLOYEE_NAME varchar(20), DEPARTMENT_ID integer CONSTRAINT fk_department_id foreign key(DEPARTMENT_ID) references DEPARTMENT(DEPARTMENT_ID) );
S2JDBC-Genはデータベース上のテーブルの定義から次のような2つのエンティティクラスのJavaコードを生成できます。
/** * Departmentエンティティクラスです。 * * @author S2JDBC-Gen */ @Entity public class Department { /** departmentIdプロパティ */ @Id @GeneratedValue @Column(nullable = false, unique = true) public Integer departmentId; /** departmentNameプロパティ */ @Column(length = 20, nullable = true, unique = false) public String departmentName; /** employees関連プロパティ */ @OneToMany(mappedBy = "department") public List<Employee> employeeList; }
/** * Employeeエンティティクラスです。 * * @author S2JDBC-Gen */ @Entity public class Employee { /** employeeIdプロパティ */ @Id @GeneratedValue @Column(nullable = false, unique = true) public Integer employeeId; /** employeeNameプロパティ */ @Column(length = 20, nullable = true, unique = false) public String employeeName; /** departmentIdプロパティ */ @Column(nullable = true, unique = false) public Integer departmentId; /** department関連プロパティ */ @ManyToOne @JoinColumn(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID") public Department department; }
DDLの生成
エンティティクラスからDDLスクリプトを生成できます。 サポートしているデータベースオブジェクトは次の通りです。
- テーブル(主キー、NOT NULL制約、デフォルト値等の定義も含む)
- IDの採番用のシーケンス(使用するデータベースがシーケンスをサポートし、IDの採番をシーケンスを使って行う場合)
- 一意キー
- 外部キー
たとえば、上で示したEmployeeクラスからHSQLDB用のDDLスクリプトを生成すると、次のようなスクリプトが出力されます。(※読みやすいようにフォーマットしています。)
create table EMPLOYEE (ID integer generated by default as identity(start with 1), EMPLOYEE_NAME varchar(20), DEPARTMENT_ID integer, constraint EMPLOYEE_PK primary key(ID) );
alter table EMPLOYEE add constraint EMPLOYEE_FK1 foreign key (DEPARTMENT_ID) references DEPARTMENT (ID);
drop table EMPLOYEE;
alter table EMPLOYEE drop constraint EMPLOYEE_FK1;
データベースオブジェクト作成用のDDLスクリプトだけでなく削除用のDDLスクリプトも合わせて生成されます。 生成されたDDLスクリプトはS2GDBC-Genによりバージョン管理されます。
上に挙げたもの以外のデータベースオブジェクト(ビュー、トリガー、ストアドプロシージャーなど)は、S2JDBC-Genによって生成はされませんが、 これらのDDLスクリプトを別途作成して特定のディレクトリに格納すれば、S2JDBC-Genの管理下に置くことができます。
S2JDBC-GenはDDL生成時にデータベースのデータをCSV形式でダンプ出力できます。 この機能を利用すると、DDLスクリプトとDDLスクリプトに対応したデータを一緒に管理できます。
マイグレーション
バージョン管理されたDDLを使用して、データベーススキーマの再作成を実行できます。 新しいデータベーススキーマの作成後、バージョン管理されたCSV形式のデータを自動でロードすることもできます。
マイグレーションの大まかな処理の流れは次の通りです。
- 古いバージョンのデータベーススキーマを削除する。
- 新しいバージョンのデータベーススキーマを作成する。
- 新しいバージョンのデータをロードする。
- 新しいバージョンのデータベーススキーマに外部キーを適用する。
独自のDDLスクリプトを作成し、S2JDBC-Genの管理下においておけば、 そのスクリプトの実行は上記の処理の中に組み込むことができます。
Subversionなどのソースコード管理ツールでDDLスクリプトとデータを管理しておくと、 マイグレーション機能と組み合わせて複数のPCで動作している開発用データベースを簡単に同期させられます。