S2JDBC-Genの紹介 − エンティティの自動生成

最近取り組んでいたS2JDBC-Genがだいたい出来てきました。Seasarカンファレンスも近づいてきたので、今日から宣伝がてらちょっとずつ紹介していこうと思います。

S2JDBD-Genとは

S2JDBC-Genは、データベースからS2JDBCのエンティティクラスを生成したり、エンティティクラスからDDLを生成したりするツールです。Railsのようなデータベーススキーママイグレーションもサポートします。
S2JDBC-GenはAntから起動されることを想定しています(といってもAntに依存しているわけではないので、Antなしで好きに呼び出すこともできます)。今回は、Antを使ってエンティティのJavaコードを生成する方法を紹介してみます。

エンティティの自動生成

build.xmlの定義(抜粋)

さて、エンティティのJavaコードを生成する場合のbuild.xmlは次のようになります。

<taskdef resource="s2jdbc-gen-task.properties" classpathref="classpath"/>

<target name="gen-entity">
    <gen-entity
        rootpackagename="example"
        classpathref="classpath"
    />
</target>

taskdefタグはS2JDBC-GenのAntタスクを実行できるようにするための記述です。classpathref属性ではS2とS2JDBC-Genとプロジェクトのクラスパスを参照していると思ってください。ここではgen-entityというタスクを使います。

gen-entityタスクは15個ほどのプロパティを持っていますが、ほとんどのプロパティはデフォルト値を持っているのであまり指定しなくても動きます。ここでは設定しているプロパティは、エンティティクラスのルートパッケージ名を示すrootpackagename(エンティティはデフォルトで「ルートパッケージ名.entity」というパッケージに作成されます)とクラスパスの参照のclasspathrefだけです。ほかに、任意のdiconファイルをプロパティで設定できますが、デフォルトでs2jdbc.diconを使うためここでは指定していません。ちなみに、s2jdbc.diconはjdbc.diconをインクルードしていて、S2JDBC-Genはそこに指定されたデータベースに接続するのでjdbc.diconが設定してあれば別途データベース接続情報を記述する必要もありません。

生成されるコードの例

EMPLOYEE、ADDRESS、DEPARTMENTといったテーブルがデータベースに存在すると想定します。gen-entityタスクを実行するとEMPLOYEEテーブルに対応する次のようなJavaコードが生成されます。

追記JavaDocコメントがついていないのはイマイチとひがさんに指摘されたのでテンプレートを修正してJavaDocコメントもつけた版に差し替えてみました。ちなみに使っているテンプレートエンジンはFreeMarkerです。

/**
 * Employeeエンティティクラスです。
 * 
 * @author S2JDBC-Gen
 */
@Entity
public class Employee {

    /** employeeIdプロパティ */
    @Id
    @GeneratedValue
    @Column(columnDefinition = "integer")
    public Integer employeeId;

    /** employeeNameプロパティ */
    @Column(columnDefinition = "varchar(20)", nullable = true, unique = false)
    public String employeeName;

    /** departmentIdプロパティ */
    @Column(columnDefinition = "integer", nullable = true, unique = false)
    public Integer departmentId;

    /** addressIdプロパティ */
    @Column(columnDefinition = "integer", nullable = true, unique = true)
    public Integer addressId;

    /** versionプロパティ */
    @Version
    @Column(columnDefinition = "integer", nullable = true, unique = false)
    public Integer version;

    /** address関連プロパティ */
    @OneToOne
    @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ADDRESS_ID")
    public Address address;

    /** department関連プロパティ */
    @ManyToOne
    @JoinColumn(name = "DEPARTMENT_ID", referencedColumnName = "DEPARTMENT_ID")
    public Department department;
}

テーブルに対応するカラムだけでなく、外部キーの情報から@OneToOneや@ManyToOneなどの関連定義も作成します。

@ColumnのcolumnDefinition、nullable、uniqueはエンティティからDDLを生成するときに使用される情報です。この例ではHSQLDBを使ったので、columnDefinitionにはHSQLDBのデータ型が指定されていますが、異なるデータベースを使えばそのデータベースに対応したデータ型が使用されます。

生成したエンティティのテスト

エンティティを生成したら定義が間違っていないかどうか動作確認をしたくなりますが、S2JDBC-Genはデータベースの接続確認用のテストコードも出力できるのでそれを使うと動作確認が簡単にできます。この話は次回。