일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- DispatcherServlet
- layout #thymeleaf #화면분할
- autowired
- 스프링 부트
- spring
- zepettoworld.com
- Bean
- git #gitlab #github
- 스프링
- Component
- 1
- 오토와이어드
- Today
- Total
기록과 정리
JPA 연관관계 다중성 ( N:1, 1:N, 1:1, N:M ) 본문
이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 강의를 참고하였습니다.
www.inflearn.com/course/ORM-JPA-Basic/lecture/21695?tab=curriculum
연관관계 다중성
종류
- 다대일 @ManyToOne
- 일대다 @OneToMany
- 일대일 @OneToOne
- 다대다 @ManyToMany
다대일 @ManyToOne [ N:1 ]
가장 많이 사용하며 일반적이 경우
@ManyToOne 및 @JoinColumn로 연관 관계 매핑
양방향일 경우
일대다 @OneToMany [ 1:N ]
단방향일 때 , 일(1)이 연관관계의 주인으로 설정 보통 다(N)에 FK가 존재한다.
객체와 테이블의 차이때문에 반대편 테이블 에서 FK를 관리하는 구조 , 연관관계 관리를 위해 UPDATE SQL 이 실행된다.
일대다 양방향 매핑은 공식적으로 존재하지 않지만 양방향처럼 사용하는 방법으로
위와 같이 설정도 가능하지만 되도록이면 다대일 양방향을 사용하자.
일대일 @OneToOne [ 1:1 ]
일대일은 거꾸로 해도 일대일 , 하지만 주테이블과 대상테이블을 정해주도록 하자. 왜? 외래키가 두 개 존재하기 떄문에
양방향일때는 ?
대상 테이블 기준으로 단방향 연관관계는 성립하지 않는다. 하지만 양방향 연관관계는 성립가능
- 주테이블 기준 단방향 연관관계 o
- 주테이블 기준 양방향 연관관계 o
- 대상 테이블 기준 단방향 연관관계 x
- 대상 테이블 기준 양방향 연관관계 o
주 테이블 외래키 기준으로 잡느냐 , 대상 테이블 외래키 기준으로 잡느냐는 객체 지향을 유지하느냐 , 테이블 구조에 대한 전통적인 데이터베이스형 개발 방식을 선호하느냐에 따른 선호의 차이인듯하다.
다대다 @ManyToMany [ N:M ]
단순 연결 방식
특이한건 주테이블에 @JoinTable(name="MEMBER_PRODUCT")인데 MEMBER_PRODUCT라는 중간 테이블을 생성하여 연결해주는 방식을 사용한다.
보기에는 간단해 보이지만.. MEMBER_PRODUCT에 매핑되어진 PK 또는 FK 외에는 인스턴스를 추가할 수 없다는 단점이 있다. 예를 들어 price나 time ( 실무에서 쓰기 부적합하다. 더욱 더 복잡해질 테이블로 인해 )
따라서 강의에서는 해결책으로 MEMBER_PRODUCT를 하나의 엔티티로 승격(?) 시키는것을 추천한다.
다대다에 대한 한계를 중간 테이블을 엔티티화 시키면서 극복이 가능하다. 하지만 어지간한 이유 아니면 사용하는것을 추천하지 않는다.
'IT > JPA' 카테고리의 다른 글
프록시와 즉시로딩, 지연로딩 (0) | 2021.02.23 |
---|---|
JPA 고급 매핑 전략 + @MappedSuperclass (0) | 2021.02.20 |
JPA 연관관계 매핑 ( 단방향 , 양방향 ) (0) | 2021.02.16 |
엔티티 매핑 ( Entity Mapping ) (0) | 2021.02.15 |
영속성 컨텍스트 ( Entity Manager ) (0) | 2021.02.09 |