概要
Doma-Genは、AntとFreeMarkerを使用したコード生成ツールです。
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>
<gen templateFilePrimaryDir="mytempletes" ... />
生成するJavaファイルにauthorを指定する
lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにauthorの定義をします。
<#assign author="Nakamura">
<gen templateFilePrimaryDir="mytempletes" ... />