関連関係マッピングの基礎
📌 なぜ関連付けが必要ですか?
オブジェクトをデータ中心のテーブルとしてモデリングすると、コラボレーション関係を作成できません.テーブル外部キー結合を使用して関連テーブル を検索オブジェクト参照を使用して関連オブジェクトを検索 => 表とオブジェクトの間に大きな間隔があります
📌 たんほうこうかんけい
オブジェクト向けモデリング、オブジェクト関連付けの使用
📍 オブジェクトの参照とテーブルの外部キーのマッピング
📍 双方向マッピング
メンバーエンティティは一方向エンティティと同じで、Teamエンティティはセットを追加します.オブジェクトとテーブルの関連付けの違い を理解する必要があります. mappedBy最初は分かりづらく、JPA精神が崩壊(?)難易度 📍 オブジェクトとテーブルの違いオブジェクト関連=2個 メンバー->チーム関連1つ(一方向) チーム->1メンバー関連(一方向) テーブル関連=1個 メンバー<->チームの1つの関連関係(双方向) オブジェクトの双方向関係
オブジェクトの双方向関係は、実際には双方向関係ではなく、2つの異なる一方向関係である.オブジェクトを双方向に参照するには、2つの一方向関連 を作成する必要があります.
📍 表の双方向関連付けテーブルは、2つのテーブルの関連関係 を1つの外部キーで管理する. MEMBER.1つのTEAM ID外部キーは、双方向の関連付け(両側で結合可能) を有する.
双方向マッピング規則オブジェクトの2つの関係の1つを関連関係の所有者 として指定する.関連関係の所有者のみが管理(登録、変更)できる 非主人方読取り専用 マスターはmappedBy属性X を使用する.マスターでない場合、mappedByプロパティを使用してマスター を指定します.
誰が主人ですか.
外来の鍵があるところを主人にしましょう.
(例では、メンバー.teamは関連関係の所有者です)
注意)双方向マッピングの最大エラー(関連関係の所有者に値を入力しない)純オブジェクト状態を考慮すると、常に両側に値を設定: 関連編を作成する方法 双方向マッピング時の注意無限ループ ex to String()、Lombok、JSON作成ライブラリ 📝 整理する
一方向マッピングのみ関連マッピングが完了しました
双方向マッピングは、クエリー(オブジェクトグラフィックの参照)機能を逆方向に追加しただけです.
JPQLではリバースナビゲーションの作業が多い
一方向マッピングを行い、必要に応じて双方向を追加します(テーブルに影響しません)
関連関係の所有者を特定する基準=>関連関係の所有者は、外部キーの場所に基づいている必要があります. ビジネスロジックに基づくX 「Java ORM標準JPAプログラミング-基本編」課を聞いて、勉強の内容を整理しました.
オブジェクトをデータ中心のテーブルとしてモデリングすると、コラボレーション関係を作成できません.
📌 たんほうこうかんけい
オブジェクト向けモデリング、オブジェクト関連付けの使用
📍 オブジェクトの参照とテーブルの外部キーのマッピング
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
// @Column(name = "TEAM_ID")
// private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
📍 関連関係の保存//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
📍 参照としての関連付けの表示-オブジェクト図面の参照//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
//Team findTeam = em.find(Team.class, team.getId());
// => 참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
📍 関連付けの変更// 새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
// 회원1에 새로운 팀B 설정
member.setTeam(teamB);
📌 双方向関連および関連関係の所有者📍 双方向マッピング
メンバーエンティティは一方向エンティティと同じで、Teamエンティティはセットを追加します.
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
…
}
📍 オブジェクト図面を反転ブラウズするには//조회
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //역방향 조회
みみ関連関係のオーナーとmappedByオブジェクトの双方向関係は、実際には双方向関係ではなく、2つの異なる一方向関係である.
📍 表の双方向関連付け
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
全員(Owner)双方向マッピング規則
誰が主人ですか.
外来の鍵があるところを主人にしましょう.
(例では、メンバー.teamは関連関係の所有者です)
注意)双方向マッピングの最大エラー(関連関係の所有者に値を入力しない)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
//연관관계의 주인에 값 설정
member.setTeam(team); //**
em.persist(member);
に注意一方向マッピングのみ関連マッピングが完了しました
双方向マッピングは、クエリー(オブジェクトグラフィックの参照)機能を逆方向に追加しただけです.
JPQLではリバースナビゲーションの作業が多い
一方向マッピングを行い、必要に応じて双方向を追加します(テーブルに影響しません)
関連関係の所有者を特定する基準=>関連関係の所有者は、外部キーの場所に基づいている必要があります.
Reference
この問題について(関連関係マッピングの基礎), 我々は、より多くの情報をここで見つけました https://velog.io/@sxbxn/연관관계-매핑-기초テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol