[seasar-dotnet:2216] Re: [DBFlute.NET]業務的one-to-oneの設定(別リレーションのカラム利用)

kubo [E-MAIL ADDRESS DELETED]
2012年 10月 31日 (水) 17:51:22 JST


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