双方向関連および関連関係の所有者



リファレンス
  • 金英漢インフラ講座-Java ORM標準JPAプログラミング-基本編
  • Java ORM標準JPAプログラミング
  • 双方向マッピング


  • メンバーエンティティは一方向と同じであり、チームエンティティはセット
  • を追加する.
    @Entity
    public class Member {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        @Column(name = "USERNAME")
        private String name;
    
    //    @Column(name = "TEAM_ID")
    //    private Long teamId;
    
        @ManyToOne
        @JoinColumn(name = "TEAM_ID")
        private Team team;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Team getTeam() {
            return team;
        }
    
        public void setTeam(Team team) {
            this.team = team;
        }
    }
    @Entity
    public class Team {
    
        @Id @GeneratedValue
        @Column(name = "TEAM_ID")
        private Long id;
    
        private String name;
    
        @OneToMany(mappedBy = "team")
        private List<Member> members = new ArrayList<>();
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<Member> getMembers() {
            return members;
        }
    
        public void setMembers(List<Member> members) {
            this.members = members;
        }
     }
    実際、客体には双方向の関連関係はありません.2つの一方向関係がある
    テーブルは一方向なのか双方向なのか、同じです.理由は会員がFKでPKに署名できるからです.
    チームはPKとFKにサインすればいいからだ.

    関連関係の所有者とmappedBy

  • mappedBy=JPAクラッシュ難易度
  • mappedByは初めて分かりにくいです.
  • オブジェクトとテーブルの間の関連付けの違いを理解するには.
  • では、mappedByが1:Nマッピングで私と関係を結んだ変数名を値として書きます.
  • オブジェクトとテーブルの違い

  • オブジェクト関連=2個
  • メンバー->チーム関連1つ(一方向)
  • チーム->1メンバー関連(一方向)
  • テーブル関連=1個
  • メンバー<->チームの1つの関連関係(双方向)
  • オブジェクトの双方向関係


    オブジェクトの双方向関係は実は双方向関係ではなく、2つの異なる一方向関係である.
  • オブジェクトを双方向に参照するには、2つの一方向関連関係を確立する必要があります.
  • A -> B (a.getB())
  • B -> A (b.getA())
  • 表の双方向関連付け

  • テーブルは、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

    2つのうちの1つは外部キーを管理します。



    関連関係の所有者

  • TEAM IDを変更する場合、メンバーのチームを変更する必要がありますか?それともチームのメンバーを変更する必要がありますか?
  • の解決策は、関連関係の主人を見つけることです.
  • 双方向マッピング規則
  • オブジェクトの2つの関係の1つを関連関係の所有者
  • として指定する.
  • 関連者のみが管理(登録、修正)
  • を担当する.
  • 非主人方読取り専用
  • マスターはmappedBy属性を使用しません.
  • マスターでない場合、mappedByプロパティを使用してマスター
  • を指定します.

    誰を主人にする。

  • 結論は多数を主とする.
  • の外来鍵があるところが主人です.
  • ここの主人はメンバーですteam
  • そうしないと逆にチームメンバーを変更すると、メンバーはupdateクエリーを終了します.
    性能上の話題を混同し始めた

    双方向マッピングの最大エラー

  • 関連関係でない所有者入力値
  • Team team = new Team();
    team.setName("TeamA");
    em.persist(team);
    
    Member member = new Member();
    member.setName("member1");
    
    //역방향(주인이 아닌 방향)만 연관관계 설정
    team.getMembers().add(member);
    em.persist(member);
    IDUSERNAMETEAM_ID1member1null
  • 双方向マッピングの場合は、関連関係のマスターに値を入力します.
  • 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);
    IDUSERNAMETEAM_ID1member12

    双方向関連関係主義

  • 純オブジェクト状態を考慮すると、常に両側に値を設定:
  • 関連編を作成する方法
  • 双方向マッピング時の注意無限ループ
  • 例:toString()、Lombok、JSON作成ライブラリ
  • ロムフォードでtoStrongをしないで
    JSON作成ライブラリはControllerによって作成されますが、戻り値をエンティティとしないでDTO
    理由は、1つ目はStackOverflow、2つ目はエンティティが完全に変更可能であるためです.エンティティに戻った後、api spec
    変更.

    整理する

  • の一方向マッピングのみで関連マッピング
  • が完了する.
  • 双方向マッピングは、逆クエリー(オブジェクトグラフィックを参照)機能のみを追加し、
  • JPQLでのリバースナビゲーションの作業は
  • が多い.
  • 一方向マッピングを行い、必要に応じて双方向(テーブルに影響しない)
  • を追加することができる.
  • のビジネスロジックに従って関連する所有者
  • を選択することはできない.
  • 関連関係の所有者は、外部キーの位置を基準として
  • を決定する必要がある.
    コツは、初めて設計したときにすべて一方向マッピングで終わること!そしてアプリケーション開発時に、必要なら追加しましょう!