[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 メーリングリストの案内