[Seasar-user:20388] Re: DBFluteのadditionalForeignKeyについて

kubo [E-MAIL ADDRESS DELETED]
2010年 12月 4日 (土) 15:29:39 JST


久保(jflute)です。

> 原因は区分テーブルの構成にあるとしか思えません。
> 再度観直してみます。

とりあえずこちらから言えるのは、
MstClass から Member への参照が存在するのがやはり
おかしいと思うので(Member.MstClassList の存在)、
DB上の実際のFK制約なども確認してみて下さい。
(SchemaHTMLでもいいかもしれません)
どこかしらに「MstClass to Member」が
定義されちゃってる可能性があるように思えます。

2010/12/4 kuwata <[E-MAIL ADDRESS DELETED]>:
> お世話になります、桑田です。
>
> 頂いたCreate文とadditionalForeignKeyを元に
> 現在のプロジェクトに組み込んだ所、正常に動作しました。
>
> ここから構成を現在のデータベースに近い形に変更、
> commonColumnMapや区分値などの設定を確認しましたが、何故
> かプロジェクトの区分テーブルのみエラーとなります。
> 区分テーブル以外のテーブルで fixedConditionを使用した箇所
> は正常になっている事も確認しました。
>
> 原因は区分テーブルの構成にあるとしか思えません。
> 再度観直してみます。
> 色々と有難う御座いました。
> 何か分かりましたらご連絡いたします。
>
>> 久保(jflute)です。
>>
>> o dbflute-mysql-example (Java)
>> o dfnet-basic-example (C#)
>>
>> にて、ほぼ同じだと思われる構成の
>> Example を作ってみました。
>>
>> WHITE_ALL_IN_ONE_CLS ※MST_CLASS
>> WHITE_ALL_IN_ONE_CLS_REF ※ MEMBER
>>
>> AdditionalForeignKey にて、業務的many-to-oneを
>> 設定しています。特にコンパイルエラーは発生していません。
>> プロパティ構成も以下のようになっています。
>>
>> [WhiteAllInOneClsRef Entity]
>> WhiteAllInOneClsRef.WhiteAllInOneClsAsFoo
>> WhiteAllInOneClsRef.WhiteAllInOneClsAsBar
>>
>> [WhiteAllInOneCls Entity]
>> ※リレーションコードなし
>>
>> ちょっとそちらの設定と見比べて頂いて、
>> 違いがどこにあるのか確認をお願いします。
>>
>> <create 文 at replace-schema-92-whitebox.sql>
>> CREATE TABLE WHITE_ALL_IN_ONE_CLS (
>>        CLS_CATEGORY_CODE CHAR(3) NOT NULL,
>>        CLS_ELEMENT_CODE CHAR(3) NOT NULL,
>>        ATTRIBUTE_EXP TEXT NOT NULL,
>>        PRIMARY KEY (CLS_CATEGORY_CODE, CLS_ELEMENT_CODE)
>> ) ;
>>
>> CREATE TABLE WHITE_ALL_IN_ONE_CLS_REF (
>>        CLS_REF_ID INTEGER NOT NULL,
>>        FOO_CODE CHAR(3) NOT NULL,
>>        BAR_CODE CHAR(3) NOT NULL,
>>        QUX_CODE CHAR(3) NOT NULL,
>>        PRIMARY KEY (CLS_REF_ID)
>> ) ;
>>
>> <additionalForeignKeyMap.dfprop>
>> ; FK_WHITE_ALL_IN_ONE_CLS_REF_FOO_TEST = map:{
>>     ; localTableName  = WHITE_ALL_IN_ONE_CLS_REF ; foreignTableName  =
>> WHITE_ALL_IN_ONE_CLS
>>     ; localColumnName = FOO_CODE ; foreignColumnName = CLS_ELEMENT_CODE
>>     ; fixedCondition = $$foreignAlias$$.CLS_CATEGORY_CODE = 'FOO'
>>     ; fixedSuffix = AsFoo
>> }
>> ; FK_WHITE_ALL_IN_ONE_CLS_REF_BAR_TEST = map:{
>>     ; localTableName  = WHITE_ALL_IN_ONE_CLS_REF ; foreignTableName  =
>> WHITE_ALL_IN_ONE_CLS
>>     ; localColumnName = BAR_CODE ; foreignColumnName = CLS_ELEMENT_CODE
>>     ; fixedCondition = $$foreignAlias$$.CLS_CATEGORY_CODE = 'BAR'
>>     ; fixedSuffix = AsBar
>> }
>>
>>
>> 2010/12/4 kubo<[E-MAIL ADDRESS DELETED]>:
>>>
>>> 久保(jflute)です。
>>>
>>> 桑田さん、情報提供ありがとうございます。
>>> 引き続きこちらでもテストパターンを試していますが、
>>> 再現できていない状況です。
>>>
>>>>  MembernのEntitiyプロパティ
>>>>       Member.MstClassAsFoo
>>>>       Member.MstClassList
>>>>  MstClassのEntitiyプロパティ
>>>>       MstClass.Menber
>>>
>>> 設定が、一つだけにも関わらず、
>>> A. Member to MstClass の AsFoo
>>> B. MstClass to Member
>>> の二つのリレーションが定義されてしまっているということは、
>>> "B" が additionalForeignKeyMap.dfprop のどこかに潜んでいる
>>> ということはないでしょうか?(一応、確認お願いします)
>>> また、AsFoo の設定を除去しても "B" のメソッドは存在するでしょうか?
>>>
>>> また、AsFooとAsHogeHoge両方を定義した場合、
>>> Entityのプロパティ構成はどのようになりますでしょうか?
>>>
>>> 2010/12/4 kuwata<[E-MAIL ADDRESS DELETED]>:
>>>>
>>>> お世話になります、桑田です。
>>>>
>>>> 実際は dbflute-0.8.9.18を利用して開発しております。
>>>> このバージョンでエラーになっため、 dbflute-0.8.9.21
>>>> を利用してみた所、同様のエラーとなりました。
>>>>
>>>> リレーションコードですが、多重に出力されているのは
>>>> Bhvクラス Pullout~
>>>> CBクラス   ~CBSpecification   ~SpQyCall
>>>> など、関連する部分は全て多重出力されている模様です。
>>>>
>>>> 尚、設定が一つだけの場合はエラーになりませんが、fixedCondition
>>>> を使用しているにも関わらずEntitiyは下記の状態になります。
>>>>
>>>>  MembernのEntitiyプロパティ
>>>>       Member.MstClassAsFoo
>>>>       Member.MstClassList
>>>>  MstClassのEntitiyプロパティ
>>>>       MstClass.Menber
>>>>
>>>> 上記の様なEntitiyプロパティとなった為、、逆リレーションコードが
>>>> 生成されると判断しました。
>>>> 宜しくお願いします。
>>>>
>>>> # 今回はおっしゃる通り「All-in-Oneテーブル区分値」に対して、
>>>> # fixedCondition を使用しています。業務的many-to-one ですね。
>>>> # 但し、テーブル構造の改善が行えないため、困っております、
>>>>
>>>>> 久保(jflute)です。
>>>>>
>>>>> 今回のケースは、(恐らく)業務的one-to-oneではなくて、
>>>>> 「業務的many-to-one」ですね。本来、MEMBERが保持すべき
>>>>> それぞれのGROUP_CODEを補完するために、fixedCondition を
>>>>> 使っている、というところでしょうか。
>>>>>
>>>>> fixedConditionを利用した場合は逆リレーションコードは生成されない、
>>>>> という認識は合っています。実際に Example では「業務的one-to-one」と
>>>>> 「業務的many-to-one(さきほど作ったばかり)」を試していますが、
>>>>> 逆リレーションコードは生成されていません。また、fixedCondition を
>>>>> コメントアウトすると、確かに逆リレーションコードは生成されますが、
>>>>> プロパティ名に fixedSuffix が付くので、コンパイルエラーにはなりません。
>>>>>
>>>>> ということで、論理的な追っかけをしてもコンパイルエラーの原因が
>>>>> 不明なところです。先に言った情報提供をお願いします。
>>>>>
>>>>> #
>>>>> # ちなみに、まさしく「All-in-Oneテーブル区分値」に対して、
>>>>> # fixedCondition を使おうとしている感じでしょうか!?
>>>>> # できれば、All-in-Oneテーブル区分値をやめるか、
>>>>> # それぞれのGROUP_CODEもMEMBERなどに定義する
>>>>> # ように変更するのがお奨めです。
>>>>> # http://d.hatena.ne.jp/jflute/20091215/1260865365
>>>>> #
>>>>>
>>>>> 2010/12/4 kubo<[E-MAIL ADDRESS DELETED]>:
>>>>>>
>>>>>> 久保(jflute)です。
>>>>>>
>>>>>>> て関連付くのですが、MST_CLASSからMEMBERへの逆リレーションまで生成してい
>>>>>>> る模様です。このためMST_CLASSからMEMBERのリレーションコードが二重に出力
>>>>>>> され、エラーの原因になっていると思われます。
>>>>>>
>>>>>> また、リレーションコードは、具体的には、
>>>>>> どのクラスのどのメソッドでしょうか?
>>>>>> (例えば、Entity の getXxxList() メソッドなど)
>>>>>>
>>>>>> そして、業務的one-to-oneが一つだけの場合は
>>>>>> コンパイルエラーにはならないのでしょうか?
>>>>>>
>>>>>> 2010/12/4 kubo<[E-MAIL ADDRESS DELETED]>:
>>>>>>>
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>> 桑田さん、こんばんは
>>>>>>>
>>>>>>> 取り急ぎですが、確認させて下さい。
>>>>>>> この現象は、
>>>>>>> DBFlute.NET-0.8.9.21 にアップグレードした発生したのか?
>>>>>>> それとも DBFlute.NET-0.8.9.21 で初めてこの設定をして
>>>>>>> 発生したのか、どちらになりますでしょうか?
>>>>>>>
>>>>>>> 2010/12/4 N.Kuwako<[E-MAIL ADDRESS DELETED]>:
>>>>>>>>
>>>>>>>> お世話になっております。
>>>>>>>> 桑田と申します。
>>>>>>>>
>>>>>>>> 現在、DBFluteを使用して、開発を行っております。
>>>>>>>> DBFlute.NET-0.8.9.21において、additionalForeignKeyのfixedCondition
>>>>>>>> を利用して業務的one-to-oneを実現しております。
>>>>>>>> 下記のような設定をadditionalForeignKeyに記述してjdbc.bat、generate.batを
>>>>>>>> 実行してビルドを行った結果、エラーとなってしまいます。
>>>>>>>>
>>>>>>>> map:{
>>>>>>>>    ; FK_MEMBER_FOO_MST_CLASS = map:{
>>>>>>>>        ; localTableName = MEMBER
>>>>>>>>        ; foreignTableName = MST_CLASS
>>>>>>>>        ; localColumnName = FOO_CODE ; foreignColumnName = CLASS_CODE
>>>>>>>>        ; fixedCondition = $$foreignAlias$$.GROUP_CODE = 'foo'
>>>>>>>>        ; fixedSuffix = AsFoo
>>>>>>>>
>>>>>>>>    }
>>>>>>>> }
>>>>>>>>
>>>>>>>> map:{
>>>>>>>>    ; FK_MEMBER_HOGE_MST_CLASS = map:{
>>>>>>>>        ; localTableName = MEMBER
>>>>>>>>        ; foreignTableName = MST_CLASS
>>>>>>>>        ; localColumnName = HOGE_CODE ; foreignColumnName =
>>>>>>>> CLASS_CODE
>>>>>>>>        ; fixedCondition = $$foreignAlias$$.GROUP_CODE = 'hogehoge'
>>>>>>>>        ; fixedSuffix = AsHogehoge
>>>>>>>>
>>>>>>>>    }
>>>>>>>> }
>>>>>>>>
>>>>>>>> 調べた結果、MEMBERからMST_CLASSへのリレーションはfixedSuffixを元に分離し
>>>>>>>> て関連付くのですが、MST_CLASSからMEMBERへの逆リレーションまで生成してい
>>>>>>>> る模様です。このためMST_CLASSからMEMBERのリレーションコードが二重に出力
>>>>>>>> され、エラーの原因になっていると思われます。
>>>>>>>> fixedConditionを利用した場合は業務的one-to-oneとなり、逆リレーションコー
>>>>>>>> ドが出力されないと認識していたのですが、何か間違っているのでしょうか
>>>>>>>>
>>>>>>>> 大変申し訳ございませんが、ご教示いただければ幸いです。
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> 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 メーリングリストの案内