関連関係マッピングの基礎


📌 なぜ関連付けが必要ですか?
オブジェクトをデータ中心のテーブルとしてモデリングすると、コラボレーション関係を作成できません.
  • テーブル外部キー結合を使用して関連テーブル
  • を検索
  • オブジェクト参照を使用して関連オブジェクトを検索
  •     => 表とオブジェクトの間に大きな間隔があります
    📌 たんほうこうかんけい
    オブジェクト向けモデリング、オブジェクト関連付けの使用
      📍 オブジェクトの参照とテーブルの外部キーのマッピング
    @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
  • オブジェクトとテーブルの関連付けの違い
  • を理解する必要があります.
  • mappedBy最初は分かりづらく、JPA精神が崩壊(?)難易度
  • 📍 オブジェクトとテーブルの違い
  • オブジェクト関連=2個
  • メンバー->チーム関連1つ(一方向)
  • チーム->1メンバー関連(一方向)
  • テーブル関連=1個
  • メンバー<->チームの1つの関連関係(双方向)
  • オブジェクトの双方向関係
    オブジェクトの双方向関係は、実際には双方向関係ではなく、2つの異なる一方向関係である.
  • オブジェクトを双方向に参照するには、2つの一方向関連
  • を作成する必要があります.
    📍 表の双方向関連付け
  • テーブルは、2つのテーブルの関連関係
  • を1つの外部キーで管理する.
  • MEMBER.1つのTEAM ID外部キーは、双方向の関連付け(両側で結合可能)
  • を有する.
    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)
    双方向マッピング規則
  • オブジェクトの2つの関係の1つを関連関係の所有者
  • として指定する.
  • 関連関係の所有者のみが管理(登録、変更)できる
  • 非主人方読取り専用
  • マスターはmappedBy属性X
  • を使用する.
  • マスターでない場合、mappedByプロパティを使用してマスター
  • を指定します.
    誰が主人ですか.
    外来の鍵があるところを主人にしましょう.
    (例では、メンバー.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);
    に注意
  • 純オブジェクト状態を考慮すると、常に両側に値を設定:
  • 関連編を作成する方法
  • 双方向マッピング時の注意無限ループ
  • ex to String()、Lombok、JSON作成ライブラリ
  • 📝 整理する

  • 一方向マッピングのみ関連マッピングが完了しました

  • 双方向マッピングは、クエリー(オブジェクトグラフィックの参照)機能を逆方向に追加しただけです.

  • JPQLではリバースナビゲーションの作業が多い

  • 一方向マッピングを行い、必要に応じて双方向を追加します(テーブルに影響しません)

  • 関連関係の所有者を特定する基準=>関連関係の所有者は、外部キーの場所に基づいている必要があります.
  • ビジネスロジックに基づくX
  • 「Java ORM標準JPAプログラミング-基本編」課を聞いて、勉強の内容を整理しました.