EzJDBCのEntity自動生成の拡張機能!


こんにちは、Entityの自動生成ってフレームワークに依存した感じですっきりないよねとEclipseに語りかけてはコンパイルエラーを出している高橋ですm(__)m 本日は、そんなEntityの自動生成を開発者が自由にカスタマイズ出来る機能について説明したいと思います。


EzJDBCではテーブルメタデータから下記の2クラスを自動生成するscaffoldがあります。pluginの詳細は「EzJDBCのscaffold(プラグイン)です!」を参照してください。
そのscaffoldで、自動生成するEntityを開発者(Project)が自由にカスタマイズすることが可能です。


例えば、Entityのプロパティのアクセス方法1つとっても以下の様に要望が異なることがあるかと思います。
要望1.Entityのプロパティはpublicフィールドにし、可読性をあげるためアクセッサ(getter,setter)は作成しない。
要望2.Entityのプロパティはprivateフィールド、アクセッサ(getter,setter)を作成することによりカプセル化する。
要望3.Entityのプロパティはpublicフィールドにし、アクセッサ(getter,setter)も作成する。
..etc


こんな時にEzJDBCのscaffoldでは、自動生成するEntityのテンプレートを用意することにより、自由にカスタマイズすることが出来ます。


利用方法は簡単です。
プロジェクト(注1)直下にある「plugin」フォルダの「rdb.template」にある「EntityTemplate.txt」がEntityのテンプレートになります。

では、EntityTemplate.txtを見てみましょう。

まずは、要望1のEntityのプロパティをpublicフィールドにするためのテンプレートは以下の通りです。


 /* Copyright(c)XXXXXXXXXX */
 package #[PACKAGE];
 #[IMPORT]
 /** * <p>#[TABLE_DOC_NAME](#[TABLE_NAME])テーブルのエンティティ</p>
  * @author #[CREATOR]
  * @version 1.00 #[CREATE_DATE]
  */

 public class #[ENTITY_NAME] {
    /* TRYGEN_SOURCE_REPLACE_BEGIN*/
    #FIELD_START
    /** #[FIELD_DOCUMENT_NAME]*/
    public #[FIELD_TYPE] #[FIELD_NAME];
    ;#FIELD_END
    /* TRYGEN_SOURCE_REPLACE_FINAL*/
 }

簡単にテンプレートの説明をします。緑字で記述されてある「#[...]」がscaffold実行時に置き換えられる箇所になります。
また緑字の「#...」で記述されている箇所は、繰り返し行われる箇所になります。詳細は下記を参照してください。

Entity自動生成テンプレートで利用できる置き換え文字の種類は以下の通りです。

1.テーブル情報
 ・#[TABLE_NAME]:テーブル名
 ・#[TABLE_DOC_NAME]:テーブルの説明
 ・#[FIELD_DOCUMENT_NAME]:テーブル項目の説明
2.Entity情報
 ・#[PACKAGE]:パッケージ名称
 ・#[IMPORT]:結合エンティティのIMPORT
 ・#[CREATOR]:作成者
 ・#[CREATE_DATE]:作成日
 ・#[ENTITY_NAME]:エンティティ名
 ・#[FIELD_TYPE]:プロパティの型
 ・#[FIELD_NAME]:プロパティ名
 ・#[GETTER_NAME]:プロパティのゲッター名
 ・#[SETTER_NAME]:プロパティのセッター名
3.繰り返し指定
 ・#FIELD_START - #FIELD_END:プロパティの繰り返し
 ・#ACCESSOR_METHOD_START - #ACCESSOR_METHOD_END:アクセッサの繰り返し

要望2のEntityのプロパティはprivateフィールドにし、アクセッサ(getter,setter)を作成するためのテンプレートは以下の通りです。


 /* Copyright(c)XXXXXXXXXX */
 package #[PACKAGE];
 #[IMPORT]
 /** * <p>#[TABLE_DOC_NAME](#[TABLE_NAME])テーブルのエンティティ</p>
  * @author #[CREATOR]
  * @version 1.00 #[CREATE_DATE]
  */

 public class #[ENTITY_NAME] {
    /* TRYGEN_SOURCE_REPLACE_BEGIN*/
    #FIELD_START
    /** #[FIELD_DOCUMENT_NAME]*/
    private #[FIELD_TYPE] #[FIELD_NAME];
    ;#FIELD_END

    ;#ACCESSOR_METHOD_START
    ;/** <p>#[FIELD_DOCUMENT_NAME]を取得</p>
     * @return #[FIELD_TYPE] #[FIELD_DOCUMENT_NAME]を返します。
     */
    public #[FIELD_TYPE] #[GETTER_NAME]() {
       return this.#[FIELD_NAME];
    }

    /** <p>#[FIELD_DOCUMENT_NAME]を設定</p>
     * @param #[FIELD_NAME] #[FIELD_DOCUMENT_NAME]を設定します。
     */

    public void #[SETTER_NAME](#[FIELD_TYPE] #[FIELD_NAME]) {
       this.#[FIELD_NAME] = #[FIELD_NAME];
    }

    #ACCESSOR_METHOD_END
    /* TRYGEN_SOURCE_REPLACE_FINAL*/
 }

簡単ですね。後はアイディア次第で色々カスタマイズできますね(^^)

例えばプロジェクトで共通Entityを作成して自動生成するEntityに継承されス場合はテンプレートを以下の様にすればよいですし、

 public class #[ENTITY_NAME] extends 共通エンティティクラス {...}

各セッターで設定値変更チェックを行う場合は、テンプレートを以下の様にすればよいわけです。

    public void #[SETTER_NAME](#[FIELD_TYPE] #[FIELD_NAME]) {
       isChanged(this.#[FIELD_NAME],#[FIELD_NAME]);
       this.#[FIELD_NAME] = #[FIELD_NAME];
    }

マジ簡単っす(^^)v


注1:プロジェクトもpluginにより自動生成されます。詳細は「気分転換にEclipseのプラグインを作ってみました」を参照してください。