[JPA]5章関連関係マッピング基礎


この記事は、キム・ヨンハンの『Java ORM標準JPAプログラミング』を読んで学習内容を整理したものだ.
  • 一方向関連
  • 関連
  • を使用
  • 双方向関連
  • 関連関係の所有者
  • ストレージ
  • 双方向関連
  • 双方向関連関係の注意点
  • 1.一方向関連
    オブジェクトは参照(アドレス)で関連付けられ、テーブルは外部キーで関連付けられます.
    テーブルは外部キーで双方向に結合できますが、参照による関連付けは常に一方向です.
    したがって、双方向関係を作成する場合は、2つの異なる一方向関係を作成する必要があります.
    オブジェクト関係のマッピング

    オブジェクトのメンバー.チームとTableのメンバー.マッピングTEAM IDは関連関係マッピングである.
    @Entity
    public class Member {
    	...
        
    	@ManyToOne
        @JoinColumn(name="TEAM_ID)
        private Team team;
        
        ...
    }
    
    @Entity
    public class Team {
    	@Id
        @Column(name="TEAM_ID")
        private String id;
    
    }
    @ManyToOne:複数対1の関連を表す.省略不可!@JoinColumn(name="TEAM_ID):外部キーをマッピングします.省略する場合は{フィールド名++参照テーブルのカラム名}外部キーを使用します.
    2.関連関係の使用
    2.1保存
    Member member1 = new Member("member1", "회원1");
    member1.setTeam(team1); // 연관관계 설정 member1 -> team1
    em.persist(member1);
    JPAは、参照チームの識別子(Id)を外部キーとして使用して、対応する登録クエリーを作成します.
    100 JPAにエンティティを保存する場合は、関連するすべてのエンティティが永続的である必要があります.
    2.2クエリー
    オブジェクトグラフィックスの参照
    Member member = em.find(Member.class, "member1");
    Team team = member.getTeam(); // 객체 그래프 탐색
    このように、オブジェクトクエリで関連付けられたエンティティは、オブジェクトグラフィックを参照することです.
    JPQLの使用
    select m from Member m join m.team t
    where t.name=:teamName
    連結JPQLは次のようになります.teamNameと同様に、パラメータのバインドに使用される構文で始まります.
    2.3修正
    Member member = em.find(Member.class, "member1");
    member.setTeam(team2); // 회원1의 팀 수정(team1 -> team2)
    エンティティの値のみを変更すると、変更検出機能が自動的にデータベースに反映されます.
    2.4削除
    Member member = em.find(Member.class, "member1");
    member.setTeam(nul); // 연관관계 제거
    関連関係をnullに設定すると、関連関係は削除されます.
    2.5関連エンティティの削除
    member.setTeam(null); // 회원 연관관계 제거
    em.remove(team); // 팀 삭제
    関連付けられたエンティティを削除するには、既存の関連付けを削除してから削除する必要があります.
    3.双方向関連

    今回は、チームがメンバーとしてアクセスできるように、双方向の関連関係をマッピングします.
    チーム内のメンバーは1対の複数の関係であるため、リストCollectionを使用して複数のイベントに関連付けられます.
    外部キーを使用してデータベース・テーブルを双方向にクエリーできるので、何も追加する必要はありません.
    双方向関連マッピング
    @Entity
    public class Member {
    	...
        
    	@ManyToOne
        @JoinColumn(name="TEAM_ID)
        private Team team;
        
        ...
    }
    
    @Entity
    public class Team {
    	@Id
        @Column(name="TEAM_ID")
        private String id;
        
        @OneToMany(mappedBy="team") // 일대다 연관관계
        private List<Member> members = new ArrayList<Member>();
    
    }
    @OneToMany(mappedBy="team"):1対のマルチリレーションシップのマッピングmappedByプロパティは、逆マッピングのフィールド名の値を提供します.この場合、メンバー.チームなので、チームを値としてあげました.
    4.関連関係の所有者
    テーブルは、外部キーを使用して2つのテーブルの関連付けを管理します.
    双方向マッピングエンティティは、2つの位置で相互参照されるため、オブジェクトの参照が2つになり、外部キーが1つになります.
    このとき、2つのオブジェクトの関連関係の1つを定義することで、テーブル内の外部キーを関連関係の所有者と呼びます.
    関連関係の持ち主が外来鍵を持っている場所
    データベースの関連関係にマッピングし、外部キーを管理できるのは、関連関係の所有者のみです.
    逆に、主人でない方は読むしかありません.
    マスター
  • はmappedBy属性を使用しません.
  • の所有者でない場合は、mappedByプロパティを使用して、関連関係の所有者をプロパティの値として指定する必要があります.

  • 関連関係を特定する所有者は、外部キーマネージャによって選択されるため、外部キーを持つメンバーです.チームを主人にしなければならない.
    5.双方向関係の保存
    Member member1 = new Member("member1", "회원1");
    member1.setTeam(team1); // 연관관계 설정 member1 -> team1
    em.persist(member1);
    team1.getMembers().add(member1);のようなコードがあるはずですが、Team.メンバーは関連関係の所有者ではないので無視されます.
    6.双方向関係の注意点
    オブジェクトの角度から両方の方向に値を入力するのが最も安全です.
    Member member1 = new Member("member1", "회원1");
    
    // 양방향 연관관계 설정
    member1.setTeam(team1); // 연관관계의 설정 member1 -> team1
    team1.getMembers().add(member1); // 연관관계의 설정 team1 -> member1
    em.persist(member1);
    Member.team:関連関係の所有者.この値を使用して外部キーを管理します.Team.members:ホストではなく、ストレージには使用されません.
    相手の双方向の関連は私たち双方に連絡を取りましょう.
    関連メソッド
    双方向に接続するコードを再設計しましょう.
    @Entity
    public class Member {
    	...
        
    	public Team;
        
        public void setTeam(Team team) {
    		if (this.team != null) {
            	this.team.getMembers().remove(this);
            }
            this.team = team;
            team.getMembers().add(this);
        }
        
        ...
    }