Entity間のリレーション
概要
Entityには、スキーマ上のテーブル間のリレーションが、関連テーブルへのプロパティ(メソッド)として反映されます。 そのプロパティを利用して、ConditionBeanなどで検索された関連テーブルのデータを取得することができます。
リレーションを持つのは、DomainEntity のみです。CustomizeEntity は、SQLのフラットな構造に対応する Entity のため、リレーションを持ちません。
リレーションのタイプ
リレーションのタイプ(種類)と、それぞれの特徴です。これらは、Entity だけでなく、ConditionBean や Behavior など他のクラスにも通じる話です。また、ExampleDB の構造を把握しておくと一層理解がしやすくなるでしょう。
many-to-one (親テーブル)
- 例えば、会員を基点とした場合は?
- 会員ステータスが該当
- many-to-one であることの判定基準
- FK制約(or AdditionalForeignKey)で参照していること
- プロパティ名の特徴
- テーブル名がそのままキャメルケースとなったもの(例えば、memberStatus)。 但し、同じ関連テーブルへのリレーションが複数存在する場合は、プロパティ名の最後に "By[FKカラム名]" が付与される。
- 逆方向のリレーション
- 同時に、関連テーブル側には、基点テーブルへの one-to-many のリレーションが存在する
one-to-one
- 例えば、会員を基点とした場合は?
- 会員セキュリティ情報、会員退会情報が該当
- one-to-one であることの判定基準
- 基点テーブルを参照しているFKカラムに、PK制約(or AdditionalPrimaryKey)、もしくは、UQ制約(or AdditionalUniqueKey)が定義されていること
- プロパティ名の特徴
- many-to-one のプロパティ名の法則に加えて、プロパティ名の最後に "AsOne" が付与される(例えば、memberSecurityAsOne)。但し、逆方向のone-to-oneのリレーションのプロパティには付与されない。
- 逆方向のリレーション
- 関連テーブル側には、many-to-one と同じ仕様の基点テーブルへのリレーションが存在する。
- その他特徴
- FKの方向的には、one-to-many と同じ構造だが、実装上では many-to-one と(ほぼ)同じように扱うことができるため、DBFlute ではあまり子テーブルとは言わず、どちらかというと親テーブルという言葉にこのone-to-oneが含まれることが多い。
業務的one-to-one
- 例えば、会員を基点とした場合は?
- 会員住所情報が該当
- 業務的one-to-one であることの判定基準
- AdditionalForeignKeyで fixedCondition が利用されていること
- プロパティ名の特徴
- many-to-one のプロパティ名の法則に加えて、AdditionalForeignKeyの fixedSuffix がプロパティ名の最後にが付与される(例えば、memberAddressAsValid)。
- 逆方向のリレーション
- そもそも、one-to-manyとしてのリレーションが存在しているため(そちらで代替できるため)、 この業務的one-to-oneに対応する逆方向のリレーションは存在しない。
one-to-many (子テーブル)
- 例えば、会員を基点とした場合は?
- 購入、会員ログイン情報が該当
- one-to-many であることの判定基準
- 基点テーブルをFK制約(or AdditionalForeignKey)で参照していること。
- プロパティ名の特徴
- many-to-one のプロパティ名の法則に加えて、プロパティ名の最後に "List" が付与される(例えば、purchaseList)。
- 逆方向のリレーション
- 同時に、関連テーブル側には、基点テーブルへの many-to-one のリレーションが存在する
ユニーク制約を参照するFK制約
DBFluteでは、リレーションのDB上の実装は "主キー制約を参照するFK制約" が推奨されています。ユニーク制約を参照するFK制約のリレーションは、DBFluteでは基本的にサポートされません。
そのリレーションに関するJDBCのメタデータは取得されません(但し、DBMSによっては取得できる場合もあり得る:JDBCドライバの実装次第)。 additionalForeignKeyMap.dfprop にて手動で設定することで、Entity上のリレーションとして扱うことができますが、 完全なサポートは保証されません。SetupSelect, ExistsReferrer, LoadReferrer などの基本機能は利用できますが(@since 0.9.7.6)、より複雑な機能においてはその限りではありません。
それでも、"影響の少ない修正で対応できる範囲でサポートする" というスタンスになっていますので、もし、これに関する制限で困った場合は、フィードバックして相談されると良いでしょう。