JPA 다양한 연관관계 매핑
연관관계 매핑시 고려사항 3가지
-
다중성
- 다대일
- 일대다
- 일대일
- 다대다 : 실무에서 쓰면 안된다
-
단방향 양방향
- 테이블 : 외래 키로 조인하기에 방향 개념이 없다
- 객체 : 객체의 양방향 참조는 사실 두개의 단방향 참조이다
-
연관관계 주인
- 외래 키를 관리하는 참조. 반대편은 외래 키에 영향을 주지 않는다
일대다
-
일대다 단방향 관계를 맺고 싶다면?
-
가능하다. 아래처럼 연관관계를 설정해야한다
-
하지만 외래키가 멤버에 있어 멤버 테이블에 대한 쿼리가 발생하기 때문에 헷갈릴 수 있다
-
단뱡향만 필요해도 그냥 양방향으로 설정하자
-
@Entity
public class Team {
...
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
...
}
- 일대다 양방향 관계는 스펙 상 지원하지 않는다. 억지로 아래처럼 할 수는 있다
- 그냥 다대일 양뱡향을 이용하자
@Entity
public class Team {
...
@ManyToOne
// JoinColumn이 양쪽에 연결돼 JPA가 연관관계 주인을 알 수 없기 때문에
// insertable, updatable을 false로 설정한다
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
private Team team;
...
}
일대일
-
외래 키를 아무 테이블에나 넣을 수 있다
-
외래 키에 유니크 제약을 추가해 보장할 수 있다
-
다대일 단뱡향과 비슷하다
@Entity
public class Member {
...
@OneToOne
@JoinColumn(name = "LOCKER_ID)
private Locker locker;
...
}
-
대상 테이블에 외래키 단방향 관계를 설정할 수는 없다. 무조건 연관관계 주인과 외래 키를 가진 테이블을 일치 시키자
-
주 테이블에 외래 키 vs 대상 테이블에 외래 키
-
주 테이블에 외래 키
- 더 객체지향 적이다
- 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점 : 값이 없으면 외래 키에 null 허용
-
대상 테이블에 외래키
- 더 관계형 스럽다
- 장점 : 관계를 일대다로 변경해도 테이블 구조 유지
- 단점 : 프록시 기능 한계로 지연 로딩이 불가
-
다대다
- 쓰면 안된다. RDB는 매핑 테이블 없이는 다대다 관계를 표현할 수 없다. 따라서 중간 테이블이 필요한데, 실제로 테이블이 단순히 연결만 하는 경우는 없기 때문에 (하다 못해 생성일자라도 들어간다) 실무에서 사용하기 부적합하다.
@Entity
public class Member {
...
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
private List<Product> products = new ArrayList<>();
...
}
@Entity
public class Product {
...
@ManyToMany(mappedBy = "products")
private List<Member> members = new ArrayList<>();
...
}
Author And Source
이 문제에 관하여(JPA 다양한 연관관계 매핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sangmin7648/JPA-다양한-연관관계-매핑저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)