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

kuwata [E-MAIL ADDRESS DELETED]
2010年 12月 4日 (土) 13:54:35 JST


お世話になります、桑田です。

頂いた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 メーリングリストの案内