[seasar-dotnet:2219] Re: [DBFlute.NET]業務的one-to-oneの設定(別リレーションのカラム利用)
kubo
[E-MAIL ADDRESS DELETED]
2012年 11月 2日 (金) 02:00:04 JST
くぼです
uparrowさん、ご確認ありがとうございます。
なるほど、.NETでも同じ挙動ですね。
Java版でも同じ結果となりました。
ちなみに、
「対応されてもこの期日を過ぎるともう利用できない」
というような時間的な制約はどのような感じでしょうか?
かなりのコアな部分への対応になるので手順だって
やっていきたいのと、対応の妥協レベルが何段階かに
なると思うので、その辺のバランス取るのに参考にしたいと。
2012/11/1 <uparrow @ nifty.com>:
> 久保様
>
> uparrowです。
> こちらの件ご検討いただきありがとうございます。
>
> さっそくですが、試してみました。
> 結果は、想定のデータが取得できました。
>
> ただ、試した内容に自信がないので、行ったことを以下に記載します。
>
> ■T_CHILD テーブルを作成
> CREATE TABLE T_CHILD
> (
> SHIJI_ID DECIMAL(12,0) NOT NULL,
> LINE_ID DECIMAL(12,0) NOT NULL,
> TEST_CD VARCHAR(10) NULL
> )
> go
> ALTER TABLE T_CHILD
> ADD CONSTRAINT PK_T_CHILD PRIMARY KEY (SHIJI_ID, LINE_ID)
> go
>
> ■FKを設定
> [additionalForeignKeyMap.dfprop]
> ; FK_T_CHILD_01 = map:{
> ; localTableName = T_CHILD ; foreignTableName = T_B
> ; localColumnName = SHIJI_ID ; foreignColumnName = SHIJI_ID
> ; fixedSuffix = ByShijiId
> }
>
> ■テストコード
> [Test, Quill(Tx.Rollback)]
> public void FindTest2()
> {
> TChildCB cb = new TChildCB();
> cb.SetupSelect_TBByShijiId().WithTAMeiBySeizoIdSeizoLineId().WithTABySeizoId();
> cb.SetupSelect_TBByShijiId().WithMKouseiAsKousei();
> cb.Query().SetLineId_Equal(1);
> cb.Query().AddOrderBy_ShijiId_Asc();
> cb.Query().AddOrderBy_LineId_Asc();
>
> ListResultBean<TChild> dbEntityList = tChildBhv.SelectList(cb);
>
> foreach (TChild dbEntity in dbEntityList)
> {
> if (dbEntity.TBByShijiId.TAMeiBySeizoIdSeizoLineId.TABySeizoId.HinmokuCd != dbEntity.TBByShijiId.MKouseiAsKousei.SeihinHinmokuCd ||
> dbEntity.TBByShijiId.ProcNo != dbEntity.TBByShijiId.MKouseiAsKousei.ProcNo)
> {
> Assert.Fail();
> }
> }
> }
>
> 局所的な回避でもよいので、対応いただけると助かります。
>
> よろしくお願いします。
>
>> 久保(jflute)です
>>
>> uparrowさん、ちょっと試して頂きたいことがあります。
>>
>> T_Bを基点にするのではなく、
>> T_Bの子テーブル(仮にT_CHILD)を基点にConditionBeanをnewして、
>> T_CHILD -> T_B -> M_KOUSEI という関連で M_KOUSEI が
>> 正しく取得されるかどうか確認してもらいたいです。
>>
>> S2Daoはもともと一階層しか結合できないので、
>> キャッシュも一階層になっているので、
>> もしかしたら二階層目以降でのマッピングなら
>> うまく動作するのかなぁと。
>>
>> であれば、キャッシュ機構をオフにするようなオプションを
>> CBやFKに付与したりすることで、局所的な回避ができるかも
>> しれないと思いまして。
>>
>> 2012/10/31 kubo <dbflute @ gmail.com>:
>> > 久保(jflute)です
>> >
>> > 期待持たせちゃうと悪いので、早めにメールしておきます。
>> > 結論的には
>> > 「今回DBFlute.NETで、この件の対応するのは難しい」
>> > 回避策があるなら回避で、という感じです。
>> >
>> > VIEWを作るやり方がお奨めですが、
>> > DB変更ができないからこそ困ってるって
>> > 感じであれば、VIEWも作れないですかね。
>> > すると個別に検索する方式での回避になってしまいます。
>> >
>> >> o Entity取得時のみ追加的にOverRelationのキーを含める
>> >> -> 局所的な対応となるが、わりと現実的かも
>> > の方向で進めていたのですが、
>> > 修正範囲が広く、Java版だとしてもかなり頑張る必要がある上に、
>> > .NET版においてはS2Dao.NETと絡む部分にもろ影響するので、
>> > やはりDBFluteRuntime.NETを作ってからじゃないと修正は厳しい
>> > と判断しました。
>> >
>> > かといってJava版だけ対応するってのも今回はやらずで、
>> > 既に1.0.0出しているのでコアなロジックに手を入れたくないのと、
>> > あまりに特殊なパターンで、かつ、非推奨と言えるDB構造のため、
>> > 修正量(リスク)のわりに対応ポイントが局所的であるので、
>> > 正式な Unsupported という扱いにしたいと思います。
>> >
>> > 実現可能性の思考はさらに続けていく予定ですが、
>> > 現時点では上記の通りです。
>> > 寒くなっていく季節変わりを感じながら、
>> > 発想生まれる場所でインスピレーションを待ちたいと。
>> >
>> >
>> > #
>> > # うーん、個人的にはめっちゃ悔しい限りなんですけど...
>> > #
>> >
>> > 2012/10/29 kubo <dbflute @ gmail.com>:
>> >> 久保(jflute)です
>> >>
>> >> 途中経過です。
>> >> 「厳しく時間掛かるかもだけど考え続けています」
>> >>
>> >> o カラムにOverRelationを組み込む
>> >> -> 全体設計的に難しい
>> >> o Entity取得時のみ追加的にOverRelationのキーを含める
>> >> -> 局所的な対応となるが、わりと現実的かも
>> >> o キー利用のキャッシュを抑制するオプション
>> >> -> キャッシュを利用しなければマッピングは正しくなる
>> >> -> 全く同じ値の関連Entityが毎回newされる (最終手段)
>> >>
>> >> Java版でも再現しています。
>> >> まずは気軽に試せるJava版で試行錯誤しています。
>> >> ただ、.NET版ではS2Dao.NETが絡む部分などで修正の
>> >> 敷居が上がってしまうため、そこを見越した修正内容に
>> >> していくためのさじ加減を考慮に入れています。
>> >>
>> >>
>> >> 一応、回避としては、HINMOKU_CDを持った
>> >> T_Bのビューを作成すればってやり方が一つあります。
>> >>
>> >> 2012/10/26 <uparrow @ nifty.com>:
>> >>> 久保 様
>> >>>
>> >>> uparrowです。
>> >>>
>> >>>> なので、本当はこんなイメージなんですよね。(いまできないけど)
>> >>>>
>> >>>> ; FK_T_B_A02 = map:{
>> >>>> ; localTableName = T_B ; foreignTableName = M_KOUSEI
>> >>>> ; localColumnName =
>> >>>> PROC_NO/$$over($localTable.TAMeiBySeizoIdSeizoLineId.TABySeizoId)$$.HINMOKU_CD
>> >>>> ; foreignColumnName = PROC_NO/SEIHIN_HINMOKU_CD
>> >>>> }
>> >>> はい。このイメージです。
>> >>> このようなことができると助かります。
>> >>>
>> >>>> ちょと対応できるかどうかも含めて考えますね
>> >>> 現在は、別なデータの取得で回避していますが、
>> >>> 対応していただけると嬉しいです。
>> >>>
>> >>> よろしくお願いします。
>> >>>
>> >>>> 久保(jflute)です
>> >>>>
>> >>>> 恐らくですが、
>> >>>> EntityにマッピングするときのM_KOUSEIに
>> >>>> 対するキーがユニークにならなくて、
>> >>>> マッピングがうまくいってないのかと考えられます。
>> >>>>
>> >>>> fixedConditionは、
>> >>>> 相手がmanyのときにoneするための絞り込み(業務的one-to-one)、
>> >>>> もしくは、
>> >>>> 自分が関連と無関係なmanyを含んでるときに絞り込み(業務的many-to-one)、
>> >>>> に利用されることを想定していますが、
>> >>>> キーは、あくまで localColumnName や foreignColumnName に
>> >>>> 定義されたものである必要があります。
>> >>>>
>> >>>> なので、本当はこんなイメージなんですよね。(いまできないけど)
>> >>>>
>> >>>> ; FK_T_B_A02 = map:{
>> >>>> ; localTableName = T_B ; foreignTableName = M_KOUSEI
>> >>>> ; localColumnName =
>> >>>> PROC_NO/$$over($localTable.TAMeiBySeizoIdSeizoLineId.TABySeizoId)$$.HINMOKU_CD
>> >>>> ; foreignColumnName = PROC_NO/SEIHIN_HINMOKU_CD
>> >>>> }
>> >>>>
>> >>>> ちょと対応できるかどうかも含めて考えますね
>> >>>>
>> >>>>
>> >>>> 2012/10/26 村上れお <uparrow @ nifty.com>:
>> >>>> > 久保様
>> >>>> >
>> >>>> > uparrowと申します。
>> >>>> >
>> >>>> > こちらの送信サーバの問題かと思い、同様のメールを投稿してしまいました。
>> >>>> > すみません。
>> >>>> >
>> >>>> > 状況は変わっておりません。
>> >>>> >
>> >>>> > おっしゃる通り、発行されるSQLは問題なく、想定するデータを取得する文が
>> >>>> > 発行されているようでした。
>> >>>> >
>> >>>> >> アプリから実行するとEntityのデータがおかしい、って感じでしょうか?
>> >>>> >> また、具体的にEntityがどのようなデータになってしまうのでしょうか?
>> >>>> >> (例えば、T_Bに紐付くM_KOUSEIのデータが別レコードものだったり)
>> >>>> > その通りで、M_KOUSEIのデータの紐づくはずのない別なレコードが
>> >>>> > Entityに設定されておりました。
>> >>>> > Entityに設定される別なレコードの規則性はつかめておりません。
>> >>>> >
>> >>>> > 対応いただけると非常に助かります。
>> >>>> > テスト的に作成した環境もまだありますので、何かご協力できることがあれば
>> >>>> > いたします。
>> >>>> >
>> >>>> > よろしくお願いいたします。
>> >>>> >
>> >>>> >> 久保(jflute)です
>> >>>> >>
>> >>>> >> uparrowさん、こんばんは
>> >>>> >> まずはすいません。SeasarのMLの不具合で、
>> >>>> >> こちらのメールを受信しのがつい先ほどでして。
>> >>>> >> 既に何か進展あったかもしれませんが取り急ぎ。
>> >>>> >>
>> >>>> >> 設定の方、ぱっと見まちがったところはないように思えます。
>> >>>> >> 発行されるSQLをDBツールで実行すると想定する値になるけど、
>> >>>> >> アプリから実行するとEntityのデータがおかしい、って感じでしょうか?
>> >>>> >> また、具体的にEntityがどのようなデータになってしまうのでしょうか?
>> >>>> >> (例えば、T_Bに紐付くM_KOUSEIのデータが別レコードものだったり)
>> >>>> >>
>> >>>> >> 2012/10/15 <uparrow @ nifty.com>:
>> >>>> >> > uparrowと申します。
>> >>>> >> >
>> >>>> >> > 業務的one-to-oneを使おうと思っていますが、思ったデータが取得できずに困っています。
>> >>>> >> >
>> >>>> >> > 親の親の項目&自分の項目 と 別な親の2つの項目を
>> >>>> >> > 条件としてテーブルを結合させる必要があり、業務的one-to-oneの別リレーションのカラム利用
>> >>>> >> > する方法でadditionalForeignKeyMapのプロパティに設定しました。
>> >>>> >> >
>> >>>> >> > 実際にデータの取得を試みると、発行されるSQLは想定通りなのですが
>> >>>> >> > DBFluteのエンティティに設定される値が想定と異なるのです。
>> >>>> >> > (結合条件に使用しているキーなのに、それぞれのテーブルのエンティティの項
>> >>>> >> > 目値がことなる。)
>> >>>> >> >
>> >>>> >> > 設定や、使用方法に誤りがあるのでしょうか?
>> >>>> >> > アドバイスを頂戴できると助かります。
>> >>>> >> >
>> >>>> >> > [テーブル]
>> >>>> >> > 親 T_A
>> >>>> >> > 子 T_A_MEI
>> >>>> >> >
>> >>>> >> > 親 T_A_MEI
>> >>>> >> > 子 T_B
>> >>>> >> >
>> >>>> >> > 親 M_KOUSEI
>> >>>> >> > 子 T_B ←自分のテーブル
>> >>>> >> >
>> >>>> >> > 親の親(T_A)のHINMOKU_CD & 自分(T_B)のPROC_NO
>> >>>> >> > 別な親(M_KOUSEI)のSEIHIN_HINMOKU_CD & PROC_NO
>> >>>> >> > をキーとして結合したい。
>> >>>> >> > クエリ発行後のM_KOUSEIのエンティティが想定の値と異なる。
>> >>>> >> >
>> >>>> >> > [テーブルDDL]
>> >>>> >> > 具体的なテーブルは以下となります。
>> >>>> >> > CREATE TABLE T_A
>> >>>> >> > (
>> >>>> >> > SEIZO_ID DECIMAL(12,0) NOT NULL,
>> >>>> >> > HINMOKU_CD VARCHAR(30) NULL,
>> >>>> >> > )
>> >>>> >> > go
>> >>>> >> > ALTER TABLE T_A
>> >>>> >> > ADD CONSTRAINT PK_T_A PRIMARY KEY (SEIZO_ID)
>> >>>> >> > go
>> >>>> >> >
>> >>>> >> > CREATE TABLE T_A_MEI
>> >>>> >> > (
>> >>>> >> > SEIZO_ID DECIMAL(12,0) NOT NULL,
>> >>>> >> > LINE_ID DECIMAL(12,0) NOT NULL,
>> >>>> >> > )
>> >>>> >> > go
>> >>>> >> > ALTER TABLE T_A_MEI
>> >>>> >> > ADD PRIMARY KEY (SEIZO_ID, LINE_ID)
>> >>>> >> > go
>> >>>> >> >
>> >>>> >> > CREATE TABLE T_B
>> >>>> >> > (
>> >>>> >> > SHIJI_ID DECIMAL(12,0) NOT NULL,
>> >>>> >> > SEIZO_ID DECIMAL(12,0) NULL,
>> >>>> >> > SEIZO_LINE_ID DECIMAL(12,0) NULL,
>> >>>> >> > PROC_NO VARCHAR(20) NULL,
>> >>>> >> > )
>> >>>> >> > go
>> >>>> >> > ALTER TABLE T_B
>> >>>> >> > ADD CONSTRAINT PK_T_B PRIMARY KEY (SHIJI_ID)
>> >>>> >> > go
>> >>>> >> >
>> >>>> >> > CREATE TABLE M_KOUSEI
>> >>>> >> > (
>> >>>> >> > SEIHIN_HINMOKU_CD VARCHAR(30) NOT NULL,
>> >>>> >> > PROC_NO VARCHAR(20) NOT NULL,
>> >>>> >> > BUHIN_NO VARCHAR(20) NOT NULL,
>> >>>> >> > KANAGATA_CD VARCHAR(20) NULL
>> >>>> >> > )
>> >>>> >> > go
>> >>>> >> > ALTER TABLE M_KOUSEI
>> >>>> >> > ADD CONSTRAINT PK_M_KOUSEI PRIMARY KEY (SEIHIN_HINMOKU_CD, PROC_NO)
>> >>>> >> > go
>> >>>> >> >
>> >>>> >> >
>> >>>> >> > [additionalForeignKeyMap]
>> >>>> >> > ; FK_T_A_MEI_01 = map:{
>> >>>> >> > ; localTableName = T_A_MEI ; foreignTableName = T_A
>> >>>> >> > ; localColumnName = SEIZO_ID ; foreignColumnName = SEIZO_ID
>> >>>> >> > ; fixedSuffix = BySeizoId
>> >>>> >> > }
>> >>>> >> > ; FK_T_B_02 = map:{
>> >>>> >> > ; localTableName = T_B ; foreignTableName = T_A_MEI
>> >>>> >> > ; localColumnName = SEIZO_ID/SEIZO_LINE_ID ; foreignColumnName = SEIZO_ID/LINE_ID
>> >>>> >> > ; fixedSuffix = BySeizoIdSeizoLineId
>> >>>> >> > }
>> >>>> >> > ; FK_T_B_A02 = map:{
>> >>>> >> > ; localTableName = T_B ; foreignTableName = M_KOUSEI
>> >>>> >> > ; localColumnName = PROC_NO ; foreignColumnName = PROC_NO
>> >>>> >> > ; fixedCondition =
>> >>>> >> > $$over($localTable.TAMeiBySeizoIdSeizoLineId.TABySeizoId)$$.HINMOKU_CD = $$foreignAlias$$.SEIHIN_HINMOKU_CD
>> >>>> >> > ; fixedSuffix = AsKousei
>> >>>> >> > }
>> >>>> >> >
>> >>>> >> > [データ取得ソース]
>> >>>> >> > [Test, Quill(Tx.Rollback)]
>> >>>> >> > public void FindTest()
>> >>>> >> > {
>> >>>> >> > TBCB cb = new TBCB();
>> >>>> >> > cb.SetupSelect_TAMeiBySeizoIdSeizoLineId().WithTABySeizoId();
>> >>>> >> > cb.SetupSelect_MKouseiAsKousei();
>> >>>> >> >
>> >>>> >> > cb.Query().AddOrderBy_ShijiId_Asc();
>> >>>> >> >
>> >>>> >> > ListResultBean<TB> dbEntityList = tBBhv.SelectList(cb);
>> >>>> >> >
>> >>>> >> > foreach (TB dbEntity in dbEntityList)
>> >>>> >> > {
>> >>>> >> > if (dbEntity.TAMeiBySeizoIdSeizoLineId.TABySeizoId.HinmokuCd != dbEntity.MKouseiAsKousei.SeihinHinmokuCd ||
>> >>>> >> > dbEntity.ProcNo != dbEntity.MKouseiAsKousei.ProcNo)
>> >>>> >> > {
>> >>>> >> > Assert.Fail();
>> >>>> >> > }
>> >>>> >> > }
>> >>>> >> > }
>> >>>> >> >
>> >>>> >> > [発行されるSQL]
>> >>>> >> > select dfloc.SHIJI_ID as c0, dfloc.SEIZO_ID as c1, dfloc.SEIZO_LINE_ID as c2, dfloc.PROC_NO as c3
>> >>>> >> > , dfrel_0.SEIZO_ID as c4, dfrel_0.LINE_ID as c5
>> >>>> >> > , dfrel_0_0.SEIZO_ID as c6, dfrel_0_0.HINMOKU_CD as c7
>> >>>> >> > , dfrel_1.SEIHIN_HINMOKU_CD as c8, dfrel_1.PROC_NO as c9, dfrel_1.BUHIN_NO as c10, dfrel_1.KANAGATA_CD as c11
>> >>>> >> > from T_B dfloc
>> >>>> >> > left outer join T_A_MEI dfrel_0 on dfloc.SEIZO_ID = dfrel_0.SEIZO_ID and dfloc.SEIZO_LINE_ID = dfrel_0.LINE_ID
>> >>>> >> > left outer join T_A dfrel_0_0 on dfrel_0.SEIZO_ID = dfrel_0_0.SEIZO_ID
>> >>>> >> > left outer join M_KOUSEI dfrel_1
>> >>>> >> > on dfloc.PROC_NO = dfrel_1.PROC_NO
>> >>>> >> > and dfrel_0_0.HINMOKU_CD = dfrel_1.SEIHIN_HINMOKU_CD
>> >>>> >> > order by dfloc.SHIJI_ID asc
>> >>>> >> >
>> >>>> >> > ( dfrel_0_0.HINMOKU_CD,dfloc.PROC_NO と dfrel_1.SEIHIN_HINMOKU_CD,dfrel_1.PROC_NO
>> >>>> >> > は想定の値が抽出されている。)
>> >>>> >> >
>> >>>> >> > バージョン
>> >>>> >> > dbflute-0.8.9.43
>> >>>> >> > データベース
>> >>>> >> > SQL Server 2008
>> >>>> >> >
>> >>>> >> > 以上、よろしくお願いいたします。
>> >>>> >> >
>> >>>> >> >
>> >>>> >> > _______________________________________________
>> >>>> >> > seasar-dotnet mailing list
>> >>>> >> > seasar-dotnet @ ml.seasar.org
>> >>>> >> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>>> >> _______________________________________________
>> >>>> >> seasar-dotnet mailing list
>> >>>> >> seasar-dotnet @ ml.seasar.org
>> >>>> >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>>> >
>> >>>> >
>> >>>> > _______________________________________________
>> >>>> > seasar-dotnet mailing list
>> >>>> > seasar-dotnet @ ml.seasar.org
>> >>>> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>>> _______________________________________________
>> >>>> seasar-dotnet mailing list
>> >>>> seasar-dotnet @ ml.seasar.org
>> >>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>>
>> >>>
>> >>> _______________________________________________
>> >>> seasar-dotnet mailing list
>> >>> seasar-dotnet @ ml.seasar.org
>> >>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
seasar-dotnet メーリングリストの案内