説明
概要
名前クラス(Namesクラス)を生成します。 名前クラスとは、エンティティのプロパティ名に対応するメソッドをもつクラスで、エンティティクラスにつき1つ生成されます。 名前クラスはタイプセーフな問い合わせを実現するために主にサービスクラス(Serviceクラス)から利用されます。 サービスクラスとは、Gen-Service タスクによって生成されるクラスです。 タイプセーフな問い合わせの詳細はタイプセーフAPI を参照してください。
このタスクは、例えば、次のようなコードを生成できます。
/** * {@link Address}のプロパティ名の集合です。 * * @author S2JDBC-Gen */ public class AddressNames { /** * idのプロパティ名を返します。 * * @return idのプロパティ名 */ public static PropertyName<Integer> id() { return new PropertyName<Integer>("id"); } /** * cityのプロパティ名を返します。 * * @return cityのプロパティ名 */ public static PropertyName<String> city() { return new PropertyName<String>("city"); } /** * employeeのプロパティ名を返します。 * * @return employeeのプロパティ名 */ public static _EmployeeNames employee() { return new _EmployeeNames("employee"); } /** * @author S2JDBC-Gen */ public static class _AddressNames extends PropertyName<Address> { /** * インスタンスを構築します。 */ public _AddressNames() { } /** * インスタンスを構築します。 * * @param name * 名前 */ public _AddressNames(final String name) { super(name); } /** * インスタンスを構築します。 * * @param parent * 親 * @param name * 名前 */ public _AddressNames(final PropertyName<?> parent, final String name) { super(parent, name); } /** * idのプロパティ名を返します。 * * @return idのプロパティ名 */ public PropertyName<Integer> id() { return new PropertyName<Integer>(this, "id"); } /** * cityのプロパティ名を返します。 * * @return cityのプロパティ名 */ public PropertyName<String> city() { return new PropertyName<String>(this, "city"); } /** * employeeのプロパティ名を返します。 * * @return employeeのプロパティ名 */ public _EmployeeNames employee() { return new _EmployeeNames(this, "employee"); } } }
これはエンティティクラスAddressに対する名前クラスです。
名前クラスのメソッドは、static importの機能を使って呼び出されることを想定しています。 static importを利用した名前クラスの使用例は次のようになります。
List<Address> list = jdbcManager .from(Address.class) .innerJoin(employee()) .where(eq(city(), "TOKYO")) .getResultList();
employee()とcity()が名前クラスのメソッドです。
名前クラスは、エンティティクラスの修正のたびに自動生成するようにしてください。
パラメータ
Antタスクへのパラメータを以下に示します。
トップレベルのパラメータ
属性 | 説明 | デフォルト値 | 必須 |
---|---|---|---|
classpathDir | エンティティクラスを含むクラスパスのディレクトリです。このディレクトリはタスクの実行時のクラスパスに含まれている必要があります。 | - | YES |
rootPackageName | ルートパッケージ名です。 | "" | NO |
entityPackageName | エンティティクラスのパッケージ名です。エンティティクラスは、rootPackageNameとこの値をピリオドで連結したパッケージに配置されているとみなされます。 | "entity" | NO |
entityClassNamePattern | このタスクで対象とするエンティティクラス名の正規表現です。 | ".*" | NO |
ignoreEntityClassNamePattern | このタスクで対象としないエンティティクラス名の正規表現です。 | "" | NO |
namesPackageName | 名前クラスのパッケージ名です。名前クラスは、rootPackageNameとこの値をピリオドで連結したパッケージに配置されます。 | "entity" | NO |
namesClassNameSuffix | 名前クラス名のサフィックスです。 | "Names" | NO |
namesTemplateFileName | 名前クラスのテンプレートファイル名です。 | "java/names.ftl" | NO |
generateNamesAggregateClass | "true"の場合、名前集約クラスを生成します。 | "true" | NO |
namesAggregateShortClassName | 名前集約クラスの単純名です。 | "Names" | NO |
namesAggregateTemplateFileName | 名前集約クラスのテンプレートファイル名です。 | "java/names-aggregate.ftl" | NO |
templateFileEncoding | テンプレートファイルのエンコーディングです。 | "UTF-8" | NO |
templateFilePrimaryDir | テンプレートファイルを検索する際の優先ディレクトリです。 | - | NO |
javaFileDestDir | Javaファイルの出力先ディレクトリです。 | "src/main/java" | NO |
javaFileEncoding | Javaファイルのエンコーディングです。 | "UTF-8" | NO |
overwrite | "true"の場合、名前インタフェースのJavaファイルを上書きします。 | "true" | NO |
configPath | JdbcManagerのコンポーネント定義を含む設定ファイルです。このタスクの実行に使用されます。 | "s2jdbc.dicon" | NO |
env | 環境名です。 | "ut" | NO |
jdbcManagerName | JdbcManagerのコンポーネント名です。接続先のデータベースはJdbcManagerのコンポーネント名によって決まります。 | "jdbcManager" | NO |
factoryClassName | S2JDBC-Genの公開されたインタフェースの実装を作成するファクトリのクラス名です。S2JDBC-Genをカスタマイズする場合に独自のファクトリクラスを指定できます。ここに指定するクラスはorg.seasar.extension.jdbc.gen.internal.factory.Factoryインタフェースを実装している必要があります。 | "org.seasar.extension.jdbc.gen .internal.factory.FactoryImpl" |
NO |
commandInvokerClassName | S2JDBC-Genのコマンドを呼び出すクラスの名前です。コマンドの呼び出し前後で任意の処理を実行したい場合に指定します。ここに指定するクラスはorg.seasar.extension.jdbc.gen.command.CommandInvokerインタフェースを実装している必要があります。 | "org.seasar.extension.jdbc.gen .internal.command.CommandInvokerImpl" |
NO |
classpath | このタスクを実行する際のクラスパスです。 | - | classpathrefが指定されていない場合YES |
classpathref | このタスクを実行する際のクラスパスの参照です。 | - | classpathが指定されていない場合YES |
例
名前クラスのパッケージを指定する
名前クラスのデフォルトのパッケージ名は"entity"ですが、namesPackageName属性に任意のパッケージ名を指定できます。 次の例では"names"を指定しています。
<gen-names classpathDir="build/classes" rootPackageName="examples" namesPackageName="names" classpathRef="classpath" />
独自のテンプレートファイルを使用する
任意のディレクトリに独自のテンプレートファイルを置き、templateFilePrimaryDir属性にそのディレクトリを指定することで、 独自のテンプレートファイルを使用できます。
S2JDBC-Genのテンプレートは、配布ファイルのresources/tempaltesディレクトリ以下にあります。 名前クラスのテンプレートはjava/names.ftlになります。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarker のドキュメントを参照してください。
テンプレートファイルを格納するディレクトリをmytempletesとする場合、 修正した独自テンプレートを使用するにはテンプレートをmytempletes/java/names.ftlと配置し、templateFilePrimaryDir属性にmytempletesを指定します。
<gen-names classpathDir="build/classes" rootPackageName="examples" templateFilePrimaryDir="mytempletes" classpathRef="classpath" />
mytempletes/my-names.ftlのように、テンプレートファイルを任意の名前で配置したい場合は、 templateFilePrimaryDir属性に加え、namesTemplateFileName属性も指定します。
<gen-names classpathDir="build/classes" rootPackageName="examples" templateFilePrimaryDir="mytempletes" namesTemplateFileName="my-names.ftl" classpathRef="classpath" />
生成するJavaファイルに共通のヘッダーとしてコピーライトを含める
lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにcopyrightの定義をします。
<#assign copyright> /* * Copyright 2008-2009 ... * All rights reserved. */ </#assign>
<gen-names classpathDir="build/classes" rootPackageName="examples" templateFilePrimaryDir="mytempletes" classpathRef="classpath" />
copyright.ftlにコピーライトを記述することもできます(過去バージョンとの互換機能として残されています)。 copyright.ftlを使う場合は、#assignタグを使わずコピーライトのみを指定してください。 lib.ftlと同様、copyright.ftlはtemplateFilePrimaryDir属性に指定するディレクトリに配置する必要があります。
生成するJavaファイルにauthorを指定する
lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにauthorの定義をします。
<#assign author="Nakamura">
<gen-names classpathDir="build/classes" rootPackageName="examples" templateFilePrimaryDir="mytempletes" classpathRef="classpath" />
名前集約クラスを利用する
名前集約クラスをstatic importすると、個々の名前クラスを選択的にstatic importする手間が省けます。 名前集約クラスは名前クラスをstaticなメソッドで提供するためです。 名前集約クラスは、名前クラスが生成されるパッケージと同じパッケージに自動で生成されます。 クラスのデフォルトの単純名は「Names」です。この名前はnamesAggregateClassSimpleName属性で変更できます。
名前集約クラスを利用すると、概要 の例は次のようになります。List<Address> list = jdbcManager .from(Address.class) .innerJoin(address().employee()) .where(eq(address().city(), "TOKYO")) .getResultList();