About

ドキュメント

プロジェクト文書

Built by Maven

概要

Doma-Genは、AntFreeMarkerを使用したコード生成ツールです。

Doma-Genを利用すると、次のことが可能です。

  • エンティティクラスのJavaコード生成
  • DaoインタフェースのJavaコード生成

Javaコードは、データベースの定義情報を基に作成されます。

セットアップ

Doma-Genの配布ファイルを、ダウンロードページからダウンロードします。

配布ファイルを解凍し、Doma-GenとFreeMarkerのjarファイルとサンプル用のビルドファイル(doma-gen-build.xml)を取り出してください。

jarファイルは、Antタスクのクラスパスに通す必要があります。 サンプル用のビルドファイルは、独自ビルドファイル作成時のコピー元として活用してください。

Genタスク

Genタスクは、データベースに接続してメタデータを読み取り、その情報を基にエンティティクラスとDaoインタフェースのソースコードを生成します。

Genタスクを利用するには、次のようにtaskdefタグを使用します。 taskdefのclasspathref属性には、Doma-Gen、FreeMarker、JDBCドライバのjarファイルが参照されるように設定してください(Doma本体のjarファイルは不要です)。

<path id="classpath">
    <fileset dir="lib"/>
</path>

<taskdef name="gen" classname="org.seasar.doma.extension.gen.task.Gen" classpathref="classpath" />

<target name="xxx">
    <gen
        javaDestDir="src"
        dialectName="hsqldb"
        driverClassName="org.hsqldb.jdbcDriver"
        url="jdbc:hsqldb:file:example"
        user="sa"
        password=""
        configClassName="example.AppConfig"
    />
</target>

taskdefのclasspathref属性には、Doma-Gen、FreeMarker、JDBCドライバのjarファイルが参照されるように設定してください(Doma本体のjarファイルは不要です)。

Genタスクのパラメータ

Genタスクのパラメータ定義は次の通りです。

属性 説明 デフォルト値 必須
dialectName 接続するRDBMSの方言名。次のうちのどれかを指定できます。"h2"、"hsqldb"、"mysql"、"postgres"、"oracle" - dialectClassNameが指定されていない場合YES
dialectClassName 接続するRDBMSの方言クラス名。org.seasar.doma.extension.gen.dialect.Dialectの実装クラスでなければいけません。dialectNameの指定により利用できる組み込みの方言クラス以外を利用する場合に指定します。 - dialectNameが指定されていない場合YES
driverClassName JDBCドライバクラス名。java.sql.Driverの実装クラスでなければいけません。 - YES
user JDBC接続ユーザー。 - YES
password JDBC接続パスワード。 - YES
url JDBC接続URL。 - YES
schemaName 対象とするスキーマ名です。 - NO
tableNamePattern 対象とするテーブル名の正規表現です。大文字小文字の違いは考慮されません。 ".*" NO
ignoreTableNamePattern 対象としないテーブル名の正規表現です。大文字小文字の違いは考慮されません。 ".*\$.*" NO
versionColumnNamePattern エンティティのプロパティに@Versionを付与するカラム名の正規表現です。大文字小文字の違いは考慮されません。 "VERSION([_]?NO)?" NO
genEntity "true"の場合、エンティティクラスのJavaコードを生成します。 "true" NO
entityPackageName エンティティクラスのパッケージ名です。 "example.entity" NO
entitySuperclassName このタスクで対象とするエンティティクラスのスーパークラスの完全修飾名です。 - NO
entityListenerClassName このタスクで対象とするエンティティクラスに共通のエンティティリスナーの完全修飾名です。@Entityのlistener要素で使用されます。 - NO
namingType ネーミング規約です。"none"、 "snake_upper_case"、 "snake_lower_case"、"upper_case"、"lower_case"のいずれかの値を指定できます。@Entityのnaming要素に使用されます。 - NO
entityPropertyClassNamesFile エンティティプロパティのクラス名を解決するためのファイルです。形式は、キーをエンティティプロパティ名の正規表現、値をクラスの完全修飾名とするプロパティファイル形式です。 - NO
generationType 識別子を生成する方法です。"identity"、 "sequence"、 "table"のいずれかの値を指定できます。使用するRDBMSがサポートしていない場合、"identity"や"sequence"を指定するとエラーが発生します。この指定は、エンティティに対応するテーブルが単一の主キーを持つ場合にのみ有効です。複数の主キーがある場合、この指定は無視されます。@GeneratedValueのstrategy要素に使用されます。 - NO
initialValue 識別子の初期値です。generationTypeに"sequence"もしくは"table"を指定した場合にのみ有効です。@SequenceGeneratorや@TableGeneratorのinitialValue要素に指定されます。 - NO
allocationSize 識別子の割り当てサイズです。generationTypeに"sequence"もしくは"table"を指定した場合にのみ有効です。@SequenceGeneratorや@TableGeneratorのallocationSize要素に指定されます。 - NO
useAccessor "true"の場合、エンティティクラスにアクセサメソッドを付与します。 "true" NO
showDbComment "true"の場合、データベースに対するコメントをエンティティのJavadocコメントに適用します。テーブルへのコメントはクラスのJavadocコメントに反映され、カラムへのコメントはプロパティのJavadocコメントに反映されます。 "true" NO
showCatalogName "true"の場合、@Tableのcatalog属性にカタログ名を明記します。 "false" NO
showSchemaName "true"の場合、@Tableのschema属性にスキーマ名を明記します。 "false" NO
showTableName "true"の場合、@Tableのname属性にテーブル名を明記します。 "true" NO
showColumnName "true"の場合、@Columnのname属性にカラム名を明記します。 "true" NO
genDao "true"の場合、DaoインタフェースのJavaコードを生成します。 "true" NO
daoPackageName Daoインタフェースのパッケージ名です。 "example.dao" NO
daoSuffix Daoインタフェース名のサフィックスです。Daoインタフェースの名前はエンティティクラス名に、この値をサフィックスしたものになります。 "Dao" NO
configClassName 設定クラスの完全修飾名です。@Daoのconfig要素に使用されます。 - YES
templateFileEncoding テンプレートファイルのエンコーディングです。 "UTF-8" NO
templateFilePrimaryDir テンプレートファイルを検索する際の優先ディレクトリです。 - NO
javaFileDestDir Javaファイルの出力先ディレクトリです。 - YES
javaFileEncoding Javaファイルのエンコーディングです。 "UTF-8" NO
overwrite "true"の場合、Javaファイルを上書きします。 "false" NO
globalFactoryClassName このタスクで使用されるインスタンスを生成するファクトリの完全修飾名です。org.seasar.doma.extension.gen.GlobalFactoryの実装クラスでなければいけません。このタスクの振る舞いをカスタマイズ場合に指定します。 "org.seasar.doma.extension.gen.GlobalFactory" NO

Genタスクの使用例

エンティティクラスに共通のスーパークラスを指定する

entitySuperclassName属性に、エンティティクラスに共通のスーパークラスの名前を指定できます。 たとえば、エンティティに対応するすべてのテーブルにCREATE_TIMESTAMPとUPDATE_TIMESTAMPというカラムが定義されている場合、 次のようなクラスを作成し、すべてのエンティティのスーパークラスに指定できます。

@Entity
public class Common {
    Date createTimestamp;
    Date updateTimestamp;
    ...
}

スーパークラス名をentitySuperclassName属性に指定します。

<gen
    entitySuperclassName="example.Common"
    ...
/>

タスクを実行するとexample.Commonを継承した次のようなクラスが生成されます。

@Entity
public class Employee extends Common {
    @Id
    Integer id;
    String name;
    ...
}

エンティティプロパティのクラス名を指定する

ドメインクラスを使用する場合など、特定のエンティティプロパティに対しクラス名を指定したいことがあります。

クラス名の指定は、プロパティファイルで行います。 キーは、エンティティプロパティの完全修飾名を正規表現で表したもの、値はマッピングしたいクラスの完全修飾名です。 エンティティプロパティの完全修飾名とは、「エンティティクラスの完全修飾名」と「エンティティプロパティ名」を「@」で連結したものです。 たとえば、Employeeエンティティクラスのエンティティプロパティ名が「Name」で終わるものを「example.domain.Name」クラスにマッピングさせたい場合は次のように記述します。

example.entity.Employee@.*Name$=example.domain.Name

生成されるエンティティクラスでは、次のようにemployeeNameプロパティの型が「example.domain.Name」になります。

@Entity
public class Employee extends Common {
    @Id
    Integer id;
    Name employeeName;
    ...
}

すべてのエンティティクラスのエンティティプロパティ名が「Name」で終わるものを「example.domain.Name」クラスにマッピングさせたい場合は次のように記述できます。

.*Name$=example.domain.Name

プロパティファイルは、エンティティプロパティごとに上から順番に評価され、正規表現がマッチした時点で評価を終えます。 どの行にもマッチしない場合、クラス名はデフォルトのクラス名になります。

プロパティファイルはentityPropertyClassNamesFile属性に指定できます。(ここでは辞書ファイルの名前をentityPropertyClassNames.propertiesとします。)

<gen
    entityPropertyClassNamesFile="entityPropertyClassNames.properties"
    ...
/>

独自のテンプレートファイルを使用する

Doma-Genのテンプレートは、配布ファイルのresources/tempalteディレクトリ以下にあります。 エンティティクラスのテンプレートはentity.ftl、Daoインタフェースのテンプレートはdao.ftlになります。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarkerのドキュメントを参照してください。

修正したentity.ftlやdao.ftlは、ファイル名を変更せずにtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 mytempleteディレクトリに配置する場合、templateFilePrimaryDir属性にmytempletesを指定します。

<gen
    templateFilePrimaryDir="mytempletes"
    ...
/>

生成するJavaファイルに共通のヘッダーとしてコピーライトを含める

lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにcopyrightの定義をします。

<#assign copyright>
/*
 * Copyright 2008-2009 ...
 * All rights reserved.
 */
</#assign>
mytempletes/lib.ftlと配置する場合、タスクの定義は次のようになります。

<gen
    templateFilePrimaryDir="mytempletes"
    ...
/>

生成するJavaファイルにauthorを指定する

lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにauthorの定義をします。

<#assign author="Nakamura">
mytempletes/lib.ftlと配置する場合、タスクの定義は次のようになります。

<gen
    templateFilePrimaryDir="mytempletes"
    ...
/>