연관관계 매핑 고려사항 3가지
- 다중성
- 1:n, n:m(실무에서 x), n:1, 1:1
- 단방향, 양방향
- 테이블: 외래키 하나로 양쪽 조인 가능(방향 개념 x)
- 객체 : 참조용 필드가 있어야 참조 가능(방향 개념 o)
- 연관관계 주인
- 테이블 : 외래키 하나로 두 테이블이 연관관계 맺음
- 객체 : 양방향 관계는 A→B, B→ A와 같이 참조가 2개 = 외래키 관리할 곳(연관관계 주인) 필요
다대일(N:1)
N 쪽이 외래키 관리(연관관계 주인)
- 다대일 단방향
- @ManyToOne + @JoinColumn(name = "TEAM_ID")
- 다대일 양방향 : 외래키 있는 쪽이 연관관계 주인, 항상 서로 참조 필수
- @ManyToOne + JoinColumn(name = "TEAM_ID") → 연관관계 주인
- @OneToMany(mappedBy="team")
일대다(1:N)
엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션(Collection, Map, List, Set) 중 하나 사용
- 일대다 단방향 : 반대쪽 테이블에 있는 외래키 관리(외래키가 N쪽 테이블에 있어서) → 단점
- @OneToMany + @JoinColumn(name="TEAM_ID") → Member 테이블의 TEAM_ID(FK)
- 일대다 양방향 : 다대일 양방향 매핑 사용 권장
- @OneToMany + @JoinColumn(name="TEAM_ID")
- @ManyToOne + @JoinColumn(name = "TEAM_ID", insertable=false, updatable=false) → 읽기만 가능하도록 설정
일대일(1:1)
- 주 테이블에 외래키, 일대일 단방향
- @OneToOne + JoinColumn(name = "LOCKER_ID")
- 주 테이블에 외래키, 일대일 양방향
- @OneToOne + JoinColumn(name = "LOCKER_ID") → 연관관계 주인
- @OneToOne(mappedBy="locker")
- 대상 테이블에 외래키, 일대일 단방향 : 지원 X
- 대상 테이블에 외래키, 일대일 양방향
- @OneToOne(mappedBy="member")
- @OneToOne + @JoinColumn(name = "MEMBER_ID")
다대다(N:N)
중간에 연결 테이블(엔티티)을 추가해서 활용, 실무X