연관관계 매핑
- 객체의 참조와 테이블의 외래키를 매핑하는 것을 말한다.
연관관계 고려할 점
- 방향 : 단방향(한 객체에서 다른 객체만 참조), 양방향(두 객체가 서로 참조하는 관계)
- 다중성 : 일대다(1:N, OneToMany), 다대일(N:1, ManyToOne), 일대일(1:1, OneToOne),
다대다(N:N, ManyToMany)
- 연관관계의 주인 : 두 객체 중 하나를 외래 키를 관리해야 한다. 외래키를 관리하는 객체를 연관관계의 주인이라 한다. (양방향)
단방향, 양방향
- DB 테이블은 외래키 하나로 양쪽 테이블 조인이 가능하지만 객체는 참조용 필드가 있는 객체만 참조가 가능하다.
- 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면양방향
- @JoinColumn 에 해당하는 컬럼은 FK 가 있는 컬럼을 의미한다.
따라서 name = "FK컬럼명" 을 매핑해주면 된다
- 일대다 : 다대일 -1:N, N:1 - 에서 연관관계의 주인은 항상 '다' 쪽이 외래키를 갖고,
'다' 쪽이 연관관계의 주인이 된다
다대일 N:1
단방향
- 가장 흔하고, 가장 많이 사용되는 다중성
- 다대일의 반대는 일대다 N:1 -> 1:N
양방향
- 외래키가 있는 쪽이 양방향의 연관관계 주인
- 관계가 N인 쪽에서 항상 연관관계 주인
- 양쪽을 서로 참조 하도록 개발 - > 단방향이 2개
일대다 1:N
단방향
- 일대다 단방향은 일대에서 일(1) 쪽이 연관관계의 주인이 됨.
- 테이블 일대다 관계는 항상 다(N) 쪽에 외래키가 있음
- 객체와 테이블 차이 대문에 반대편에서 테이블의 외래키를 관리하는 특이한 구조
-@JoinColumn 을 꼭 사용해야함(중간에 테이블이 하나 추가됨)
- 엔티티가 관리하는 외래키가 다른 테이블에 존재
- 연관관계 관리를 위해 추가로 update SQL이 실행됨
- 따라서 일대다 단방향보다는 다대일 양방향 매핑을 사용이 권장된다.
양방향
- 사실 양방향 일대다 매핑은 공식적으로 존재하지 않는다.
- 연관관계의 주인이 아닌 쪽에서 @JoinCoulum(insertable = false, updatetable=false)를 사용 => 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법
- 다대일 양방향을 사용합시다
일대일 1:1
단방향
- 일대일 관게는 반대도 일대일
- 주 테이블이나 대상 테이블 중 외래키 선택가능 => 외래키가 있는곳이 연관관계 주인
- DB에 외래키 제약조건에 유니크 제약조건이 꼭 필요함 => 다대일에서 FK에 유니크 제약조건이 추가된 경우
회원-회원 사물함의 관계 1:1
양방향
- 다대일 양방향 매핑과 동일하게 FK가 있는 곳이 연관관계의 주인
- 반대편은 mappedBy 적용
다대다 N:M(실무에서 사용X)
@ManyToMany를 를 사용하면 편리한점
- 도메인 모델이 단순, 연결 테이블을 자동으로 생성 및 설정
실무에서의 한계점
- 연결 테이블은 단순히 연결만 하고 끝나지 않습니다.
- 연결 테이블에 추가 정보를 필요로 할때가 있습니다.
한계 극복
- @ManyToMany를 @ManyToOne가 @OneToMany를 활용하여 일대다, 다대일 관계로 풀어준다
출처 : 자바 ORM 표준 jpa 프로그래밍 기초