다양한 연관관계 매핑

다양한 연관관계 매핑

연관관계 매핑 시 고려사항

- 다중성

- 단방향, 양방향

- 연관관계 주인

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의 관계

Member-> MemberProduct

Product -> MemberProduct

위의 코드와 같이 ManyToMany의 연관관계에서는 이런 식으로 중간 테이블을 매핑할 클래스를 지정해주고, 1:N, N:1 방식으로 풀어주어야 한다.

출처 : https://www.inflearn.com/course/ORM-JPA-Basic#

from http://dobi852.tistory.com/26 by ccl(A) rewrite - 2021-10-09 02:02:03