[解決済み] 1対多、多対1、多対多の違い?
質問
些細な質問かもしれませんが、それぞれの違いや使用するタイミングを視覚的に理解するのに苦労しています。また、単方向マッピングや双方向マッピングのような概念が、一対多/多対多の関係にどのように影響するのか、少し不明です。私は今Hibernateを使用しているので、ORMに関連した説明があれば助かります。
例として、次のようなセットアップがあるとします。
public class Person{
private Long personId;
private Set<Skill> skills;
//Getters and setters
}
public class Skill{
private Long skillId;
private String skillName;
//Getters and setters
}
では、この場合、どのようなマッピングになるのでしょうか?この具体的な例に対する回答は非常にありがたいのですが、1対多と多対多のどちらを使用するのか、結合テーブルと結合カラム、単方向と双方向のどちらを使用するのかという点についても概要を知りたいのです。
どのように解決するのですか?
一対多 : 一人の人間が多くのスキルを持ち、複数の人間の間でスキルが再利用されない。
- <強い 単方向性 : Personは、Setを介して直接Skillsを参照することができます。
- 双方向性 : 各スキルの子プロセスへのポインタは1つです。 人物(あなたのコードでは表示されていません。)
多対多 : 一人の人間が多くのスキルを持ち、そのスキルは複数の人間の間で再利用される。
- <強い 単方向性 : Personは、Setを介して直接Skillsを参照することができます。
- 双方向性 : スキルには、そのスキルに関連する「人」のセットがあります。
1対多の関係では、1つのオブジェクトがquot;parent"で、1つのオブジェクトがquot;child"である。 親は子の存在をコントロールします。 Many-To-Manyでは、どちらかのタイプの存在が、両者の外部にある何か(より大きなアプリケーションのコンテキスト)に依存しています。
しかし、リレーションシップを一方向にするか双方向にするかは、メモリ、処理、パフォーマンスなどをトレードオフするエンジニアリング上の決定事項であると私は考えています。
混乱しがちなのは、多対多の双方向リレーションシップは対称である必要がないことです! つまり、多くの人があるスキルを指しますが、そのスキルはその人だけに関係する必要はないのです。 一般的にはそうですが、そのような対称性は必要条件ではありません。例えば、愛は双方向性(I-Love", "Loves-Me" )ですが、しばしば非対称性(I love her, but she does not love me")があります!このような非対称性の関係を「愛」と呼びます。
これらはすべて、HibernateとJPAで十分にサポートされています。 ただ、双方向の多対多の関係を管理する場合、Hibernateやその他のORMは対称性を維持することにこだわらないということを覚えておいてください...それはすべてアプリケーション次第です。
関連
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
Methodのinvokeメソッド実装のJavaリフレクション
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Java Persistence APIにおけるFetchType LAZYとEAGERの違い?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
javaで非静的な解を静的な参照にすることができない
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Methodのinvokeメソッド実装のJavaリフレクション
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
JSPで「リストが型解決できない!」の解決方法
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?