@ManyToOne
@OneToMany
@OneToOne
@ManyToMany
단방향
외래키는 ‘다’쪽에 존재해야 함.
외래키가 있는 곳에 참조를 걸고 연관관계 매핑을 하면 된다.
Team은 Member를 참조하고자하는 의지 ❌
다대일 양방향
단방향
권장하지 않는 모델, 실무에서는 거의 가져가지 않는다.
Member 쿼리 → Team 쿼리 → Member UPDATE 쿼리
1
부분에서 FK를 관리하지만 DB 설계상 N
쪽에 FK가 들어갈 수 밖에 없음
객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 구조 ➡️ ORM이 억지로 해결
@JoinColumn을 꼭 사용.
단점
- 엔티티가 관리하는 외래키가 다른 테이블에 존재 ➡️ 어마어마한 단점
- 연관관계를 관리를 위해 추가로 UPDATE SQL 실행
➡️ 다대일 양방향으로 해서 비슷하게 사용(연관관계 주인을 member로 지정), 객체적으로는 손해지만 DB에 설계관점을 맞추어 유지보수에 장점을 가짐
양방향
Member에 추가
일대일 관계는 그 반대도 일대일
주 테이블이나 대상 테이블 중에 외래 키 선택 가능 ➡️ 둘 중 한 곳만
외래 키에 데이터베이스 유니크 제약조건이 추가가 되어야함
단방향
유니크 조건은 MEMBER 테이블, LOCKER 테이블 둘 중 아무 곳에 존재해도 상관 ❌
양방향
Locker에 Member 추가
일대일 : 대상 테이블에 외래 키 단방향
일대일 : 대상 테이블에 외래 키 양방향
주 테이블에 외래 키
대상 테이블에 외래 키(양방향으로 개발)
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계 표현 ❌ ➡️ 연결 테이블을 추가해 일대다, 다대일 관계로 풀어내야함
객체는 컬랙션을 사용해서 객체 2개로 다대다 관계 가능
@ManyToMany 사용
@JoinTable로 연결 테이블 지정
단방향, 양방향 가능
실무에서 사용 ❌
단방향
Member에 추가
양방향
product에 추가
한계
@JoinTable
에 의해 생긴 연결 테이블은 연결의 역할만 하기 때문에 추가적인 필드를 가질 수 없다.한계 극복
연결 테이블용 엔티티 추가
@ManyToMany
➡️ @OneToMany
, @ManyToOne
Member측 ManyToMany를 OneToMany로 변경
Product측 ManyToMany를 OneToMany로 변경
테이블 연결용 엔티티