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