[Seasar-user:13356] Re: 【DBFlute】ConditionBean による複数の親の親(おじいちゃん)の取得

kubo [E-MAIL ADDRESS DELETED]
2008年 3月 20日 (木) 15:30:14 JST


久保です。

森さん

他の方もご協力もあり、こちらでも再現して原因を掴めました。
(それが前メールオーバーライドの追加となります)

https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example
のPurchaseCBTest.test_ConditionBean_selectList_setupSelectSame_withForeignForeign_Tx()
が再現して修正後通ったテストになります。

この修正を反映させたDBFlue-0.6.7のリリース直前モジュールが
以下からダウンロードできます。
http://dbflute.sandbox.seasar.org/download/dbflute/dbflute-0.6.7.zip

こちらで自動生成し直して試して頂けないでしょうか?
もし、動作確認できたらそれをそのまま正式リリースとしたいと思います。
(こちらでは既に確認が済んでおります)

よろしくお願いします。

2008/3/20 森和紀 <[E-MAIL ADDRESS DELETED]>:
> 久保さん
>
>  お世話になっております。森です。
>
>  > S2DaoMetaDataExtension.RelationRowCreatorExtensionに
>  > 以下のオーバーライドを追加してみて下さい。
>  確認してみます。(明後日になりますが)
>
>  いつも素早い返信、ありがとうございます。
>
>
>
>  以上です。
>
>  08/03/19 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>  > 久保です。
>  >
>  > 森さん、ありがとうございます。
>  > まさしく試してもらおうかと思っていたことでした。
>  >
>  > S2DaoMetaDataExtension.RelationRowCreatorExtensionに
>  > 以下のオーバーライドを追加してみて下さい。
>  >
>  >        @Override
>  >        protected RelationRowCreationResource createResourceForRow(ResultSet rs,
>  >                RelationPropertyType rpt, Set columnNames, Map relKeyValues,
>  >                Map relationPropertyCache) throws SQLException {
>  >            final RelationRowCreationResource res = new
>  > RelationRowCreationResourceExtension();
>  >            res.setResultSet(rs);
>  >            res.setRelationPropertyType(rpt);
>  >            res.setColumnNames(columnNames);
>  >            res.setRelKeyValues(relKeyValues);
>  >            res.setRelationPropertyCache(relationPropertyCache);
>  >            res.setBaseSuffix("");// as Default
>  >            res.setRelationNoSuffix(buildRelationNoSuffix(rpt));
>  >            res.setLimitRelationNestLevel(getLimitRelationNestLevel());
>  >            res.setCurrentRelationNestLevel(1);// as Default
>  >            res.setCreateDeadLink(isCreateDeadLink());
>  >            return res;
>  >        }
>  >
>  >
>  >
>  > 2008/3/19 森和紀 <[E-MAIL ADDRESS DELETED]>:
>  > > 久保さん
>  > >
>  > >  お疲れさまです。森です。
>  > >
>  > >  私の環境で以下のような動作をしているため取得できていないです。
>  > >
>  > >  relationNoSuffix が「_1_0」となっている時に、Memberが取れていて、
>  > >  その後 relationNoSuffix が「_1_1」とならず、Product が取れない状態です。
>  > >
>  > >  ※S2DaoMetaDataExtension#createRelationRowで最初にrelationNoSuffixをログ
>  > >  に出力するようにオーバーライドしました。
>  > >  <ログ>
>  > >  ☆☆☆☆:_0
>  > >  ☆☆☆☆:_1
>  > >  ☆☆☆☆:_1_0
>  > >  ☆☆☆☆:_1_0_0
>  > >  ☆☆☆☆:_1_0_1
>  > >  ☆☆☆☆:_1_0_2
>  > >  ☆☆☆☆:_1_0_3
>  > >  ☆☆☆☆:_2
>  > >
>  > >  S2DaoMetaDataExtensionは自動生成されたままなのですが、
>  > >  設定やgenerate に問題があるのでしょうか?
>  > >
>  > >  <使用しているバージョン>
>  > >  S2DAO:1.0.47
>  > >  DBFlute:0.6.6
>  > >
>  > >  原因が特定は引き続き行ない、わかり次第報告させていただきます。
>  > >  以上、よろしくお願いします。
>  > >
>  > >  08/03/19 に 森和紀<[E-MAIL ADDRESS DELETED]> さんは書きました:
>  > >
>  > >
>  > > > 久保さん
>  > >  >
>  > >  > お世話になっております。森です。
>  > >  >
>  > >  > > そもそも、例題のPurchaseのsetProduct(Product entity);
>  > >  > > が呼び出されたかどうか、というのもご確認頂けると
>  > >  > > 助かります。
>  > >  > 先に、こちらを確認しました。
>  > >  > PurchaseのsetProduct(Product entity);は、呼び出されていませんでした。
>  > >  > ※ setMember(Member entity);は呼び出されています。
>  > >  >
>  > >  > お忙しいところ、お手数をおかけして申し訳ありません。
>  > >  > 以上です。
>  > >  >
>  > >  > 08/03/19 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>  > >  > > 久保です。
>  > >  > >
>  > >  > > 森さん
>  > >  > >
>  > >  > > ご報告ありがとうございます。
>  > >  > > setupRelationAllValue()あたりもそうですが、
>  > >  > > そもそも、例題のPurchaseのsetProduct(Product entity);
>  > >  > > が呼び出されたかどうか、というのもご確認頂けると
>  > >  > > 助かります。Setterをオーバーライドして問答無用で
>  > >  > > 例外を発生させるようにすればすぐに検証可能です。
>  > >  > >
>  > >  > > 2008/3/19 森和紀 <[E-MAIL ADDRESS DELETED]>:
>  > >  > > > 久保さん
>  > >  > > >
>  > >  > > >  お世話になっております。森です。
>  > >  > > >
>  > >  > > >  > 発生したQUERYと別のQUERYでも発生するかどうか
>  > >  > > >  > 確認して頂けますでしょうか?
>  > >  > > >  selectEntity や selectPage などでも同様の現象が発生しています。
>  > >  > > >  また、異なるテーブルで試しましたがやはり同じでした。
>  > >  > > >
>  > >  > > >
>  > >  > > >  > 1. ログ上のSQL文のSelect句に取得できなかった
>  > >  > > >  > テーブルのカラムが存在するかどうか?
>  > >  > > >  存在していました。
>  > >  > > >  出力された、SQLを下記に記載します。(一部編集しています。)
>  > >  > > >
>  > >  > > >
>  > >  > > >  > 2. マッピング時の対象になっているかどうか?
>  > >  > > >
>  > >  > > > > 「リレーションNO(_0_2とか)」が出力されていること、
>  > >  > > >  > そして、それが「true」であること。
>  > >  > > >  問題なさそうです。
>  > >  > > >  出力されたログを記載します。
>  > >  > > >
>  > >  > > >  > setupRelationAllValue()あたりを探ることで状況がわかるかも
>  > >  > > >  アドバイスありがとうございます。
>  > >  > > >  これから調べてみます。
>  > >  > > >
>  > >  > > >  そのほか、お気づきの点があればアドバイスお願いします。
>  > >  > > >
>  > >  > > >
>  > >  > > >  <出力されたSQL>
>  > >  > > >  select
>  > >  > > >     dflocal.PURCHASE_DETAIL_ID as PURCHASE_DETAIL_ID,
>  > >  > > >     dfrelation_1.PURCHASE_ID as PURCHASE_ID_1,
>  > >  > > >     dfrelation_1_1.MEMBER_ID as MEMBER_ID_1_1,
>  > >  > > >     dfrelation_1_0.PRODUCT_ID as PRODUCT_ID_1_0
>  > >  > > >  from
>  > >  > > >     TCLBOWNER.PURCHASE_DETAIL dflocal
>  > >  > > >     left outer join
>  > >  > > >     TCLBOWNER.PURCHASE dfrelation_1
>  > >  > > >     on
>  > >  > > >         dflocal.PURCHASE_ID = dfrelation_1.PURCHASE_ID
>  > >  > > >     left outer join
>  > >  > > >     TCLBOWNER.MEMBER dfrelation_1_1
>  > >  > > >     on
>  > >  > > >         dfrelation_1.MEMBER_ID = dfrelation_1_1.MEMBER_ID
>  > >  > > >     left outer join
>  > >  > > >     TCLBOWNER.PRODUCT dfrelation_1_0
>  > >  > > >     on
>  > >  > > >         dfrelation_1.PRODUCT_ID = dfrelation_1_0.PRODUCT_ID
>  > >  > > >  where
>  > >  > > >         dflocal.PURCHASE_DETAIL_ID = 1
>  > >  > > >
>  > >  > > >  <埋め込んだログ>
>  > >  > > >  ***: _0 = false
>  > >  > > >  ***: _1 = true
>  > >  > > >  ***: _1_0 = true
>  > >  > > >  ***: _1_0_0 = false
>  > >  > > >  ***: _1_1 = true
>  > >  > > >  ***: _1_1_0 = false
>  > >  > > >  ***: _1_1_1 = false
>  > >  > > >  ***: _1_1_2 = false
>  > >  > > >  ***: _1_1_3 = false
>  > >  > > >  ***: _1_2 = false
>  > >  > > >  ***: _1_3 = false
>  > >  > > >  ***: _2 = false
>  > >  > > >
>  > >  > > >  以上、よろしくお願いします。
>  > >  > > >
>  > >  > > >  08/03/19 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>  > >  > > >
>  > >  > > >
>  > >  > > > > 久保です。
>  > >  > > >  >
>  > >  > > >  > 森さん
>  > >  > > >  >
>  > >  > > >  > 了解です。よろしくお願いします。
>  > >  > > >  >
>  > >  > > >  > 確認ですが、以下のことを確認お願いします。
>  > >  > > >  >
>  > >  > > >  > 1. ログ上のSQL文のSelect句に取得できなかった
>  > >  > > >  > テーブルのカラムが存在するかどうか?
>  > >  > > >  > (なければ、SQL生成時点で既におかしな処理がありそうです)
>  > >  > > >  >
>  > >  > > >  >
>  > >  > > >  > 2. マッピング時の対象になっているかどうか?
>  > >  > > >  >
>  > >  > > >  > allcommon.s2dao.S2DaoMetaDataExtension$RelationRowCreatorExtension
>  > >  > > >  > のsetupPropertyCache()メソッド1185行目付近に、
>  > >  > > >  > 以下のログを出力して下さい。
>  > >  > > >  >
>  > >  > > >  > // Do only selected foreign property for performance if condition-bean exists.
>  > >  > > >  > if (hasConditionBean(res)) {
>  > >  > > >  >    final LdConditionBean cb =
>  > >  > > >  > LdConditionBeanContext.getConditionBeanOnThread();
>  > >  > > >  >    // ここから
>  > >  > > >  >    boolean kokonoHantei =
>  > >  > > >  > cb.getSqlClause().hasSelectedForeignInfo(res.getRelationNoSuffix());
>  > >  > > >  >    System.out.println("***: " + res.getRelationNoSuffix() + " = " +
>  > >  > > >  > kokonoHantei);
>  > >  > > >  >    // ここまで
>  > >  > > >  >    if (!cb.getSqlClause().hasSelectedForeignInfo(res.getRelationNoSuffix())) {
>  > >  > > >  >        return;
>  > >  > > >  >    }
>  > >  > > >  > }
>  > >  > > >  >
>  > >  > > >  > このログに、
>  > >  > > >  > 「1」で確認した該当テーブルのAlias名のSuffixの
>  > >  > > >  > 「リレーションNO(_0_2とか)」が出力されていること、
>  > >  > > >  > そして、それが「true」であること。
>  > >  > > >  > これをご確認ください。
>  > >  > > >  >
>  > >  > > >  > それでも不審点がなければ、そのすぐ上のメソッドで
>  > >  > > >  > setupRelationAllValue()あたりを探ることで状況がわかるかも
>  > >  > > >  > なのですが、ひとまず「1」と「2」を確認させて下さい。
>  > >  > > >  >
>  > >  > > >  > よろしくお願いします。
>  > >  > > >  >
>  > >  > > >  > 2008/3/18 森和紀 <[E-MAIL ADDRESS DELETED]>:
>  > >  > > >  > > 久保さん
>  > >  > > >  > >
>  > >  > > >  > >  お世話になっております。森です。
>  > >  > > >  > >
>  > >  > > >  > >  > もしかしたら、さらに限定的な現象かもしれませんので、
>  > >  > > >  > >  > 発生したQUERYと別のQUERYでも発生するかどうか
>  > >  > > >  > >  > 確認して頂けますでしょうか?
>  > >  > > >  > >  確認してみます。(明日になってしまうと思います。)
>  > >  > > >  > >
>  > >  > > >  > >  以上です。
>  > >  > > >  > >
>  > >  > > >  > >  08/03/18 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>  > >  > > >  > >
>  > >  > > >  > >
>  > >  > > >  > > > 久保です。
>  > >  > > >  > >  >
>  > >  > > >  > >  > 森さん、こんにちは
>  > >  > > >  > >  >
>  > >  > > >  > >  > ご指摘頂いた現象ですが、こちらで再現がしません。
>  > >  > > >  > >  >
>  > >  > > >  > >  > DBFluteBasicExample等で、同様の検索をしてみましたが、
>  > >  > > >  > >  > 値が取得されます。(PurchaseCBTestにて実装しています)
>  > >  > > >  > >  > https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example
>  > >  > > >  > >  >
>  > >  > > >  > >  > もしかしたら、さらに限定的な現象かもしれませんので、
>  > >  > > >  > >  > 発生したQUERYと別のQUERYでも発生するかどうか
>  > >  > > >  > >  > 確認して頂けますでしょうか?
>  > >  > > >  > >  >
>  > >  > > >  > >  >
>  > >  > > >  > >  > 2008/3/18 森和紀 <[E-MAIL ADDRESS DELETED]>:
>  > >  > > >  > >  > > お世話になります、森と申します。
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  ConditionBean による複数の親の親(おじいちゃん)の取得で確認したいことがあります。
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  親の親(おじいちゃん)の取得は「withXXX」メソッドを使用しているのですが、
>  > >  > > >  > >  > >  同じ親テーブルに対して複数の親の親(おじいちゃん)を取得することができません。
>  > >  > > >  > >  > >  ※1つだけは取得できます。
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  以前使用していたバージョンでは取得できていたのですが、最新のバージョンで取得
>  > >  > > >  > >  > >  することができません。
>  > >  > > >  > >  > >  何か変更があったのでしょうか?
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  現在のバージョン DBFlute 0.6.6
>  > >  > > >  > >  > >  以前のバージョン DBFlute 0.5.5
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  <実装>
>  > >  > > >  > >  > >  PurchaseDetailCB cb = new PurchaseDetailCB ();
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  cb.setupSelect_Purchase().withMember();
>  > >  > > >  > >  > >  cb.setupSelect_Purchase().withProduct();
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  cb.query().setPurchaseDetailId_Equal(2002);
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  PurchaseDetail result = purchaseDetailBhv.selectEntity(cb);
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  result.getPurchase().getMember(); // こっちは取れる
>  > >  > > >  > >  > >  result.getPurchase().getProduct(); // nullとなってしまう
>  > >  > > >  > >  > >
>  > >  > > >  > >  > >  以上、よろしくお願いします。
>  > >  > > >  > >  > >  _______________________________________________
>  > >  > > >  > >  > >  Seasar-user mailing list
>  > >  > > >  > >  > >  [E-MAIL ADDRESS DELETED]
>  > >  > > >  > >  > >  https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > > >  > >  > >
>  > >  > > >  > >  > _______________________________________________
>  > >  > > >  > >  > Seasar-user mailing list
>  > >  > > >  > >  > [E-MAIL ADDRESS DELETED]
>  > >  > > >  > >  > https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > > >  > >  >
>  > >  > > >  > >  _______________________________________________
>  > >  > > >  > >  Seasar-user mailing list
>  > >  > > >  > >  [E-MAIL ADDRESS DELETED]
>  > >  > > >  > >  https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > > >  > >
>  > >  > > >  > _______________________________________________
>  > >  > > >  > Seasar-user mailing list
>  > >  > > >  > [E-MAIL ADDRESS DELETED]
>  > >  > > >  > https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > > >  >
>  > >  > > >  _______________________________________________
>  > >  > > >  Seasar-user mailing list
>  > >  > > >  [E-MAIL ADDRESS DELETED]
>  > >  > > >  https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > > >
>  > >  > > _______________________________________________
>  > >  > > Seasar-user mailing list
>  > >  > > [E-MAIL ADDRESS DELETED]
>  > >  > > https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >  > >
>  > >  >
>  > >  _______________________________________________
>  > >  Seasar-user mailing list
>  > >  [E-MAIL ADDRESS DELETED]
>  > >  https://ml.seasar.org/mailman/listinfo/seasar-user
>  > >
>  > _______________________________________________
>  > Seasar-user mailing list
>  > [E-MAIL ADDRESS DELETED]
>  > https://ml.seasar.org/mailman/listinfo/seasar-user
>  >
>  _______________________________________________
>  Seasar-user mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-user
>


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