[Seasar-user:10190] Re: [DBFlute]CommonColumnSetupの仕様について

kubo [E-MAIL ADDRESS DELETED]
2007年 8月 29日 (水) 21:44:50 JST


久保です。

多加谷さん、こんばんわ

> CommonColumnSetupの仕様について質問します。
> 
> CommonColumnSetupに指定したカラムの一部だけを含むエンティティ
> について、CommonColumnSetupは実行されるのでしょうか?
> 
> (もし実行されない場合、ソースコードの修正で対応できるでしょうか?)

残念ながら、今の仕様では、
「共通列として設定された列を全て含むテーブルが対象」
となります。一部だけを含むものは対象となりません。

ですが、回避策がいくつか考えられます。


<A>
そのカラムの一部だけを含むテーブルは、数多いでしょうか?
もし、すくないのであれば、

BehaviorにfilterEntityOfInsert()というprotectedのMethodが
いるのですが、そのメソッドをOverrideして、

@Override
protected void filterEntityOfInsert(Entity targetEntity) {
    final MyEntity entity = (MyEntity)targetEntity;
    entity.setTargetColumn(xxx);
}

とすると、CommonColumnのInterceptorと同じ効果となります。

Updateの場合は同様にfilterEntityOfUpdate()をOverrideすればOKです。

Behaviorの各SubClassにて同じようなOverrideメソッドが
出来上がってしまいますが、数が多くなければ手っ取り速いです。


<B>
こちらも数が少ないほうが楽なのは当然ですが、
CommonColumnのSetupは、実際にDBにその列が定義されているか否かではなく、
EntityDefinedCommonColumnをimplementsしている否かで決定します。
なので、該当のExEntityにて、EntityDefinedCommonColumnを実装すれば、
CommonColumnのSetupの対象Entityとなり得ます。
存在していない列のGetter/Setterは呼び出されても何もしないようにすれば、
InterceptorからSetされても無視されるだけになります。
(試してないので恐縮ですが。。。)


<C>
「A」・「B」ダメなら(数が多いとか)、
ソースを書き換えるしかありません。
Interceptorにて、EntityDefinedCommonColumnでないEntityは即return
しているのですが、そこを「ReflectionでSetterが存在すれば設定する」
という処理を入れてあげればいけそうです。


#
# DBFlute自体も現実のDBで結構こういうパターンがあり得るので、
# 「C」の修正を検討しています。
#



Seasar-user メーリングリストの案内