[seasar-dotnet:2217] Re: [DBFlute.NET]業務的one-to-oneの設定(別リレーションのカラム利用)
kubo
[E-MAIL ADDRESS DELETED]
2012年 11月 1日 (木) 14:55:21 JST
久保(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 メーリングリストの案内