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