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

kubo [E-MAIL ADDRESS DELETED]
2010年 12月 4日 (土) 12:19:11 JST


久保(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 メーリングリストの案内