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に手を入れる場合も内容を確認する場合も見通しが良いので。。。
こういう地味な機能改善もスルーしないで強化を図っていきます。。。
地味な内容でも"チリも積もれば開発生産性が高くなる"の精神で頑張ります。。。