📚 Study
JPA 연관관계 매핑 정리
Entity
- Member
- Team
@Entity public class Member { @Id private Long id; private String name; } @Entity public class Team { @Id private Long id; private String teamName; }
1:1 일대일 단방향 (멤버:사물함)
- 하나의 멤버가 하나의 사물함을 바라봄
- 멤버는 자신의 사물함을 알 수 있음, 사물함은 자신의 멤버를 알 수 없음
- fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="locker_id") @OneToOne private Locker locker; } @Entity public class Locker { @Id private Long id; private String lockerName; }
1:1 일대일 양방향 (멤버:사물함)
- 하나의 멤버가 하나의 사물함을 바라봄
- 멤버는 자신의 사물함을 알 수 있음, 사물함도 자신의 멤버를 알 수 있음
- fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="locker_id") @OneToOne private Locker locker; } @Entity public class Locker { @Id private Long id; private String lockerName; @OneToOne(mappedBy="locker") private Member member; }
N:1 다대일 단방향
- 다수의 멤버가 하나의 팀을 바라봄
- 멤버만 팀을 알 수 있음, 팀은 속한 멤버를 알 수 없음
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="team_id") @ManyToOne private Team team; } @Entity public class Team { @Id private Long id; private String teamName; }
N:1 다대일 양방향
- 다수의 멤버가 하나의 팀을 바라봄
- 멤버는 팀을 알 수 있고, 팀도 자신에게 속한 멤버를 알 수 있음
- fk는 다수인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @ManyToOne @JoinColumn(name="team_id") private Team team; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany(mappedBy="team") private List<Member> members; }
1:N 일대다 단방향
- 하나의 팀이 여러 명의 팀을 바라봄
- 팀은 자신에게 속한 멤버를 알 수 있음, 멤버는 자신의 팀을 알 수 없음
- fk는 다수인 멤버가 가진다
- 그러나 왼쪽인 팀에서 참조하여 반대편 테이블의 외래 키를 관리한다
- 일대다 단방향 매핑은 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있음
- -> 단점!! 차라리 다대일(N:1) 양방향을 사용하라
@Entity public class Member { @Id private Long id; private String name; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany @JoinColumn(name="team_id") private List<Member> members; }
1:N 일대다 양방향
- 하나의 팀이 여러 명의 멤버를 바라봄
- 팀은 자신에게 속한 멤버를 알 수 있음, 멤버도 자신의 팀을 알 수 있음
- fk는 다수인 멤버가 가진다
- 그러나 왼쪽인 팀에서 참조하여 반대편 테이블의 외래 키를 관리한다
@Entity public class Member { @Id private Long id; private String name; @ManyToOne @JoinColumn(name="team_id", insertable=false, updatable=false) private Team team; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany @JoinColumn(name="team_id") private List<Member> members; }
N:N 다대다
- 여러 명의 멤버가 여러 개의 물건을 바라봄
- 멤버는 자신의 물건을 알 수 있음, 물건도 자신을 구매한 멤버를 알 수 있음
- fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="product_id") @ManyToMany private List<Product> productList; } @Entity public class Product { @Id private Long id; private String productName; @ManyToMany(mappedBy="productList") private List<Member> memberList; }