[TIL]航海9935日目
オブジェクトリレーションシップマッピング(ORM)で最も困難な部分は、オブジェクトリレーションシップとテーブルリレーションシップのマッピングです.
関連関係をマッピングする場合は、次の3つの点を考慮します.
方向(Direction)
[一方向、双方向]存在
会員がチーム関係を持っているとき.
会員→チームまたはチーム→会員のうち一方のみを参考にすると、一方通行になります
メンバー→チーム、チーム→メンバー双方が相互参照する双方向関係
方向はオブジェクト関係にのみ存在し、テーブルは常に双方向です.
たじゅうせい
[多対一(N:1),一対多(1:N),一対一(1:1),多対多(N:M)]が存在する.
会員がチーム関係を持っているとき.
複数のメンバーは1つのチームに属するため、メンバー:チーム=N:1
チーム:メンバー=1:N
関連関係の所有者
オブジェクトを双方向の関連関係として作成する場合は、関連関係の所有者を決定する必要があります.
参照による関連関係は常に一方向です.オブジェクト間で双方向の関連付けを作成する場合は、参照を保持するために別の端にフィールドを追加する必要があります.最終的には関連関係を構築する必要があります.しかし、厳密には双方向関係ではなく、2つの異なる一方向関係である.逆に、テーブルは外部キーで双方向に結合できます.
一方向関係(A->B)オブジェクトは、参照(アドレス)によって関連付けられます. テーブルは、外部キーで関連付けられます. を使用して参照されるオブジェクトの関連付けは一方向です.
A → B (a.b)
外部キーを使用するテーブルの関連付けは双方向です.
A JOIN B JOIN A両方とも結果は同じです
表の構造が上と同じである場合,JPAを用いて両者の関係をマッピングする.
メンバーエンティティ
チームエンティティ
メンバーエンティティとチームエンティティには、N:1(一方向)の関係があります.
@JoinColumnは外部キーのマッピングに使用します.
多対一関係で使用します.
これまで分かってきたのは,会員からチームにのみ近い多対一の一方向マッピングである.
今回は反対方向のチームからメンバーへの関係を追加し,双方向の関連関係マッピングを行い,メンバー→チーム,チーム→メンバーがアクセスできるようにした.
チームエンティティへのメンバーエンティティの追加
チームエンティティ
チームエンティティに集合リストを追加し、@OneToManyマッピング情報にmappedByプロパティを提供します.
mappedByプロパティは、双方向マッピング時にのみ使用され、逆マッピングのフィールド値を与えるだけでよい.(メンバークラスのTeamマッピングフィールド値)
@OneToManyのmappedByはなぜ必要なのでしょうか?
実際、オブジェクトはいわゆる双方向関連関係ではなく、2つの異なる一方向関連関係を組み合わせて双方向に見えるようにします.(これに対して、データベースは外部キーで結合できるため、双方向の関連付けは1つの外部キーで行うことができます)
オブジェクトの関連付けは次のとおりです.
メンバー→チーム関連1個(一方向)
チーム→メンバー関連1個(一方向)
表の関連付け
会員←>チーム関連1個(双方向)
一方向マッピングエンティティは1つの参照のみを使用するため、この参照を使用して外部キーを管理できます.
ただし、エンティティを双方向にマッピングすると、メンバー→チーム、チーム→メンバーの2つの場所で相互参照されます.したがって、オブジェクトの関連関係を管理するポイントは2つに増加します.
エンティティが双方向の関連付けに設定されている場合、オブジェクトの参照は2つで、外部キーは1つです.そのため、両者の間に差が生じる.(外部キーはどこで管理しますか?)
このような違いのため、JPAは、関連関係の所有者と呼ばれるテーブル内の外部キーを管理するために、2つのオブジェクト関連関係のうち1つを決定する必要があります.
双方向マッピングの場合は、2つの関連関係のうちの1つを関連関係のマスターとして決定します.
データベースの関連関係にマッピングし、外部キーを管理(登録、変更、削除)できるのは、関連関係の所有者のみです.マスター以外は読み取り専用です.
マスターはmappedByを使用しません.
マスターでない場合は、mappedByを使用してマスターを指定する必要があります.
=>関連関係の所有者は、外部キーがある場所に設定する必要があります.すなわち、上記の例では、外部キーteam idを持つメンバーテーブル(すなわち、メンバーエンティティ)を所有者に設定する必要があります.
実際、オブジェクトの観点から、両方の方向に値を入力するのが最も安全です.このセクションでは、2つのオブジェクトの関係を格納または削除するための便利な方法を作成できます.
関連関係をマッピングする場合は、次の3つの点を考慮します.
方向(Direction)
[一方向、双方向]存在
会員がチーム関係を持っているとき.
会員→チームまたはチーム→会員のうち一方のみを参考にすると、一方通行になります
メンバー→チーム、チーム→メンバー双方が相互参照する双方向関係
方向はオブジェクト関係にのみ存在し、テーブルは常に双方向です.
たじゅうせい
[多対一(N:1),一対多(1:N),一対一(1:1),多対多(N:M)]が存在する.
会員がチーム関係を持っているとき.
複数のメンバーは1つのチームに属するため、メンバー:チーム=N:1
チーム:メンバー=1:N
関連関係の所有者
オブジェクトを双方向の関連関係として作成する場合は、関連関係の所有者を決定する必要があります.
たんほうこうかんけい
オブジェクトの関連付けとテーブルの関連付けの最大の違い
参照による関連関係は常に一方向です.オブジェクト間で双方向の関連付けを作成する場合は、参照を保持するために別の端にフィールドを追加する必要があります.最終的には関連関係を構築する必要があります.しかし、厳密には双方向関係ではなく、2つの異なる一方向関係である.逆に、テーブルは外部キーで双方向に結合できます.
一方向関係(A->B)
class A{ B b;
}
class B {}
双方向関係(A<->B)class A { B b;
}
class B {
A a;
}
オブジェクトの関連付けとテーブルの関連付けの整理A → B (a.b)
外部キーを使用するテーブルの関連付けは双方向です.
A JOIN B JOIN A両方とも結果は同じです
オブジェクト関係のマッピング
表の構造が上と同じである場合,JPAを用いて両者の関係をマッピングする.
メンバーエンティティ
チームエンティティ
メンバーエンティティとチームエンティティには、N:1(一方向)の関係があります.
@JoinColumn
@JoinColumnは外部キーのマッピングに使用します.
@ManyToOne
多対一関係で使用します.
双方向関連
これまで分かってきたのは,会員からチームにのみ近い多対一の一方向マッピングである.
今回は反対方向のチームからメンバーへの関係を追加し,双方向の関連関係マッピングを行い,メンバー→チーム,チーム→メンバーがアクセスできるようにした.
チームエンティティへのメンバーエンティティの追加
チームエンティティ
チームエンティティに集合リストを追加し、@OneToManyマッピング情報にmappedByプロパティを提供します.
mappedByプロパティは、双方向マッピング時にのみ使用され、逆マッピングのフィールド値を与えるだけでよい.(メンバークラスのTeamマッピングフィールド値)
関連関係の所有者
@OneToManyのmappedByはなぜ必要なのでしょうか?
実際、オブジェクトはいわゆる双方向関連関係ではなく、2つの異なる一方向関連関係を組み合わせて双方向に見えるようにします.(これに対して、データベースは外部キーで結合できるため、双方向の関連付けは1つの外部キーで行うことができます)
オブジェクトの関連付けは次のとおりです.
メンバー→チーム関連1個(一方向)
チーム→メンバー関連1個(一方向)
表の関連付け
会員←>チーム関連1個(双方向)
一方向マッピングエンティティは1つの参照のみを使用するため、この参照を使用して外部キーを管理できます.
ただし、エンティティを双方向にマッピングすると、メンバー→チーム、チーム→メンバーの2つの場所で相互参照されます.したがって、オブジェクトの関連関係を管理するポイントは2つに増加します.
エンティティが双方向の関連付けに設定されている場合、オブジェクトの参照は2つで、外部キーは1つです.そのため、両者の間に差が生じる.(外部キーはどこで管理しますか?)
このような違いのため、JPAは、関連関係の所有者と呼ばれるテーブル内の外部キーを管理するために、2つのオブジェクト関連関係のうち1つを決定する必要があります.
双方向マッピングのルール:関連付けられた関係の所有者
双方向マッピングの場合は、2つの関連関係のうちの1つを関連関係のマスターとして決定します.
データベースの関連関係にマッピングし、外部キーを管理(登録、変更、削除)できるのは、関連関係の所有者のみです.マスター以外は読み取り専用です.
マスターはmappedByを使用しません.
マスターでない場合は、mappedByを使用してマスターを指定する必要があります.
=>関連関係の所有者は、外部キーがある場所に設定する必要があります.すなわち、上記の例では、外部キーteam idを持つメンバーテーブル(すなわち、メンバーエンティティ)を所有者に設定する必要があります.
実際、オブジェクトの観点から、両方の方向に値を入力するのが最も安全です.このセクションでは、2つのオブジェクトの関係を格納または削除するための便利な方法を作成できます.
Reference
この問題について([TIL]航海9935日目), 我々は、より多くの情報をここで見つけました https://velog.io/@woojinshim103/TIL-항해99-34일차-1bp4mjqxテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol