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

kuwata [E-MAIL ADDRESS DELETED]
2010年 12月 6日 (月) 22:31:55 JST


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

遅くなってすみませんが、逆リレーションが生成される
テーブル構造が再現出来ました。

サンプルとして頂いたWHITE_ALL_IN_ONE_CLS_REFの構造を
下記の状態で設定します。(主キーが変更されています。)

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,FOO_CODE,BAR_CODE)
) ;

この状態でサンプルで頂いたadditionalForeignKeyMap.dfprop
の設定でgenerateしますと、逆リレーションが生成され、エラー
となります。

以上、お手数お掛けして申し訳ありませんが
何か分かりましたらご教示の程、宜しくお願い致します。

>
> 久保(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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>



Seasar-user メーリングリストの案内