[seasar-dotnet:262] [S2Dao]報告・要望:開発中に発生した出来事
kubo
jazzflute @ mbn.nifty.com
2006年 7月 3日 (月) 10:01:33 JST
久保です。
開発中に発生した出来事を報告(質問/要望も!?)させて頂きます。
<A>
現象:
自己参照FKをRELNOに設定すると、無限ループが発生する。
考察:
DaoMetaDataImpl
→new BeanMetaDataImpl();
→SetupProperty()
→CreateRelationPropertyType()
→new RelationPropertyTypeImpl()
→new BeanMetaDataImpl(beanType, dbMetaData, dbms);//★
→SetupProperty()
ここで、relationがfalseなので、(★のConstructorにてDefaultでfalse)
if(!relation)
{
IRelationPropertyType rpt = CreateRelationPropertyType(
beanType, pi, relnoAttr, dbMetaData, dbms);
AddRelationPropertyType(rpt);
}
にまた入り、これが延々続きます。
Java版では、このrelationは、
「relationとしてBeanMetaDataを生成する」場合にtrueとなります。
つまり、★マークの部分ではtrueにして、
上述の if(!relation) には引っ掛からないようにするべきです(のはず)。
無限ループだけでなく、初期化すると、RELNOで繋がっているテーブル全てを
終点まで初期化してしまっています。
<B>
現象:
Where句におけるIN句条件のバインドで正常に実行されなかった。
where mng_FreeSpace.action
in /*dto.ConditionQuery.Action.InScope*/('a1', 'a2')
↓↓↓
where mng_FreeSpace.action
in ('A'.ConditionQuery.Action.InScope1, 'C'.ConditionQuery.Action.InScope2)
考察:
すいませんが時間がなくて検証できてません。とりあえずプロジェクトで
IN句が必要になることがなかったので保留課題としています。
InScopeのプロパティは「System.Collections.IList」です。
Java版では、上述のやり方で正常に動作しています。
吐き出されたSQLを見るに、Supportされていないと言うよりは、
何かちょっとした処理のミスで誤動作してしまっているように
見受けられます。
<C>
現象:
ID属性を設定すると、UPDATE時のPK列名が「Property名」になって
SQLExceptionとなる。但し、明示的にColumn属性を付けるとOK。
ex) free_id numeric(10) identity
[Seasar.Dao.Attrs.ID("identity")]
public Nullables.NullableDecimal FreeId {
↓↓↓
where FreeId = xxx
考察:
これもColumn属性を付けて回避しています。
Java版で発生するかも検証しきれてません。
(Program的にな差異も特に見つけられず・・・)
DtoMetaDataImpl()#CreatePropertyType()を見ると、
当然の動きなのですが、この現象は仕様でしょうか?
<D>
別のスレッドに投稿しましたが、IDとTimestamp属性のNullables対応です。
<E>
現象:
SqlCommentでスペルミスなので記述ミスをした場合のエラー内容が
わかりにくい。
考察:
CommandContextImpl.GetArg()の
PropertyInfo pi = type.GetProperty(names[pos]);
value = pi.GetValue(value, null);
の部分ですが、piがNULLでNullReferenceExとなります。
なので、何が間違っていたのかが全くわからない状態で終わります。
(開発現場では結構痛い)
今、このように書き換えて対応しています。
PropertyInfo pi = type.GetProperty(names[pos]);
if (pi == null) {
String msg = "The sqlComment is invalid!";
msg = msg + " name=" + name + " type=" + type + " names[pos]=" + names[pos] + " pos=" + pos;
throw new SystemException(msg);
}
value = pi.GetValue(value, null);
これで少なくとも開発者が何をスペルミスしたのかがわかります。
細かいところですが、対応して頂きたい箇所です。
一気に報告で申し訳ありませんが、対応をお願いしたいと思います。
特に「A」と「B」と「E」の内容は開発において結構クリティカルな
ものなので、自分の以外のS2Daoユーザにとっても大事かと思います。
※ちなみに自分、一次リリースを「S2Dao書き換えバージョン」で
リリースとなりました。二次では「ダウンロードしたままのS2Dao」で
リリースしたいと考えております。
お忙しいかと思いますが、よろしくお願いします。
--
kubo <jazzflute @ mbn.nifty.com>
seasar-dotnet メーリングリストの案内