- 연관관계 매핑 시 고려사항
- 다중성
- 단방향, 양방향
- 연관관계 주인
N : 1
위의 코드를 보면 @ManyToOne으로 N:1의 관계로 매핑되어있다. 즉 이 엔티티는 연관관계의 주인이자 TEAM_ID의 외래 키를 가지고 있는 엔티티이다.
그리고 그 반대로 @OneToMany로 서로 대칭으로 이루어져 있는데, 이 엔티티는 연관관계의 주인이 아니다. 따라서 mappedBy로 연관관계의 주인의 변수를 참조하고 이 엔티티는 읽기 전용이 된다.
1:1 관계
- 일대일 관계는 그 반대도 일대일
- 주 테이블이나 대상 테이블 중에 외래 키 선택 가능
- 주 테이블에 외래 키
- 대상 테이블에 외래 키
- 외래 키에 데이터베이스 유니크 제약조건 추가
위의 코드를 보면 OneToOne 관계인데 1:N 관계의 양방향 연관관계랑 매우 유사하다. 위의 경우 상관없이 joincolumn으로 외래 키를 지정할 수 있고, 반대쪽 엔티티에 mappedBy를 걸어주면 된다. DB의 테이블도 마찬가지로 두 개의 테이블 상관없이 외래 키를 지정해주고 사용할 수 있다.
하지만 여기서 Member 클래스에서 만약 외래 키를 지정하고 DB 테이블의 연관관계 매핑을 Locker로 지정하는 것은 불가능하다.
(같은 객체와 테이블에서만 지정가능)
N : M (다대다)
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수없음
- 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함
[ 정규화(Normalization)란? ]
정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않
음으로써 무결성(intergrity)을 유지할 수 있으며, DB의 저장 용량도 줄일 수 있다.
객체는 컬렉션을 사용해서 객체 2개로 다대다 관계를 만들 수 있으나, 관계형 데이터베이스 같은 경우 2개의 테이블에 중간 테이블을 만들어 2개의 테이블의 외래 키를 가지게 설계한다.
- 여기서 중요한 점은 실무에서 @ManyToMany는 사용하면 안 된다.
- 매핑 정보만 들어가고 중간 테이블에 추가 정보를 넣을 수가 없다.
- 쿼리를 작성하기가 매우 어렵게 된다.
- 연결 테이블이 단순히 연결만 하고 끝나지 않으며, 주문시간, 수량 같은 데이터가 들어올 수 있다.
아래 코드와 같이 @ManyToMany -> @OneToMany, @ManyToOne으로 풀어서 사용해야 한다.
위의 코드는 Member와 Product테이블의 중간 역할을 하는 객체를 생성했다.
Member에서 1:N의 관계
Product에서 N:1의 관계
위의 코드와 같이 ManyToMany의 연관관계에서는 이런 식으로 중간 테이블을 매핑할 클래스를 지정해주고, 1:N, N:1 방식으로 풀어주어야 한다.
출처 : https://www.inflearn.com/course/ORM-JPA-Basic#
'JPA' 카테고리의 다른 글
프록시, 즉시 로딩과 지연 로딩 (0) | 2021.10.11 |
---|---|
고급 매핑 (0) | 2021.10.10 |
연관관계 매핑 (0) | 2021.10.08 |
엔티티 매핑 (0) | 2021.10.07 |
flush, 준영속 상태 (0) | 2021.10.06 |