EzJDBCのEntity自動生成機能


EzJDBCでは、テーブル・メタデータから「Entity」を自動生成するscaffoldを用意しました。

EzJDBCでは、テーブルの変更はDBA行うべきという方針のもと(不在の場合はPG自身が行う事になる?)、テーブルに変更が生じた場合は、テーブルの変更(再作成)を行った上で、Entityの再作成(自動生成)することになります。

この場合問題となるのが、自動生成されたEntityに「追加・修正さ」れていた場合です。

この解決策として一番初めに思いつくのは、「GenerationGap」パターンかと思います。

自動生成する箇所をsuperクラスとして提供して、開発者はsubクラスに「追加・修正」することにより、Entityを再作成した場合でも、開発者が手を入れたソースを保護する事が可能になるためです。

GenerationGapは良いデザインパターンなのですが、その反面、開発者にとっては”見通しが悪く”意外と利用しづらいパターンであるのも事実です。


なので、EzJDBCでは「GenerationGap」パターンは採用しませんでした。

scaffoldより作成されるEntityは、何も継承しないPOJOで作成されます。


ですが、テーブルに変更がありEntityを再生成する場合でも、開発者が手を入れたソースは完全に保護されます。

Entityに共通機能をもたせた親クラスを継承することも自由です。。。

その秘密は、コメント・セービング・ジェネレーター(造語:適当です ^^;)にあります。


scaffoldがEntityを再作成する場合は、ソースコメントの「TRYGEN_SOURCE_REPLACE_BEGIN」から「TRYGEN_SOURCE_REPLACE_FINAL」で囲まれている内容を置き換えます。

開発者が作成したソースは、上記コメント外に記述すればよいのです。


例:顧客テーブル(CUSTOMER)のCustomerエンティティ

public class Customer{

   // 開発者が追加したコメント
   
   // TRYGEN_SOURCE_REPLACE_BEGIN
   /** ID:ID */
   public long id;
   /** 名前:NAME */
   public String name;
   // TRYGEN_SOURCE_REPLACE_FINAL

   /** 開発者が追加したプロパティ */
   private String temp;
   /** 開発者が追加したメソッド1 */
   public String getTemp() {
      return this.temp;
   }
   /** 開発者が追加したメソッド2 */
   public void setTemp(String temp) {
      this.temp = temp;
   }

}

上記、顧客テーブル(CUSTOMER)に年齢(AGE)項目を追加した場合に、scaffoldでEntityを再作成すると、開発者が追記した内容は、保護された状態で「年齢(AGE)」項目が追加されます。項目の変更・削除をした場合も同様です。

public class Customer{

   // 開発者が追加したコメント
   
   // TRYGEN_SOURCE_REPLACE_BEGIN
   /** ID:ID */
   public long id;
   /** 名前:NAME */
   public String name;
   /** 年齢:AGE */
   public int age;
   // TRYGEN_SOURCE_REPLACE_FINAL

   /** 開発者が追加したプロパティ */
   private String temp;
   /** 開発者が追加したメソッド1 */
   public String getTemp() {
      return this.temp;
   }
   /** 開発者が追加したメソッド2 */
   public void setTemp(String temp) {
      this.temp = temp;
   }
}

じみーな機能ですね…(^^;)

POJOのEntityは良いですよ。Entityに手を入れる場合も内容を確認する場合も見通しが良いので。。。

こういう地味な機能改善もスルーしないで強化を図っていきます。。。

地味な内容でも"チリも積もれば開発生産性が高くなる"の精神で頑張ります。。。