다중성
매핑시 대칭성이 있다고 생각하자
다대다 관계는 실무에서는 사용하지 말아야 한다. (대체방법 필요)
- 다대일 : @ManyToOne
- 일대다 : @OneToMany
- 일대일 : @OneToOne
- 다대다 : @ManyToMany
단방향, 양방향
테이블
- 외래 키 하나로 양쪽으로 조인 가능 → 방향 개념이 없음
- 외래키 하나로 두 테이블이 연관관계를 맺음
객체
- 참조용 필드가 있는 쪽으로만 참조 가능, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향
- 객체 양방향 관계는 참조가 2군데있음
- 둘중에 테이블의 외래 키를 관리하는 쪽을 지정하고 연관관계의 주인으로 설정하고 지정해야함
- 주인의 반대쪽은 외래 키를 업데이트하는 데에 영향을 주지 않고, 조회만 가능하다.
다대일 단방향 관계
- 가장 많이 사용하는 연관관계
- 외래키가 있는 곳에 참조를 걸고 연관관계 매핑을 하면 된다.
// Member Entity에만 아래와 같이 연관관계를 설정하는 경우 // 다대일 단방향 관계 @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team;
- 양쪽을 서로 참조하게 될 경우 양방향으로 연관관계를 지어주는데 아래와같이 설정해주면 된다.
// Team 엔티티에 설정 // 여기서 team은 Member 엔티티에 있는 team이라는 변수를 가리 @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();
일대다 단방향
- 실무에서는 별로 사용을 권장하지 않는 관계이다.
- 테이블 관계에서 FK가 위치하는 쪽을 고려해서 매핑하는 것이 중요하다.
- 일대다 단방향은 일대다에서 일(1)이 연관관계의 주인이 되버린다.
- 다(N)쪽에 외래키가 존재하게 된다.
- 객체와 테이블의 차이 떄문에 반대편 테이블이 외래 키를 관리하는 특이한 구조
- @JoinColumn을 꼭 사용해야 한다. 그렇지 않으면 JPA가 실행될 때 중간에 중간 테이블을 추가하게 된다.
- 테이블이 하나 더 들어감으로써 운영하기가 성능상으로 좋지 않다.
일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자!
일대일 관계
- 일대일 관계는 반대도 일대일 관계이다.
- 주 테이블이나 대상 테이블 중에서 선택해서 외래 키를 넣을 수 있다.
- 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가
- 다대일 양방향 매핑 처럼 외래키가 있는 곳이 연관관계의 주인
- 명확하게 일대일 관계일 경우에는 DBA의 의견이나 테이블 관계를 고려하여 설계하는 것이 중요하다.
- ex) 대체적으로 Member와 Locker의 관계로 봤을 경우 Member쪽에 Locker을 들고 있는 것이 바람직하다.
- 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점 : 값이 없으면 외래 키에 null 허용
일대일 : 대상 테이블에 외래 키 단방향 정리
- 단방향 관계는 JPA에서 지원하지 않는다.
- 양방향 관계는 지원
정리하자면 일대일 연관관계에서는 내가 내것만 관리해야 한다!
즉, 외래키가 있는 쪽에 있는 엔티티가 그 외래키를 직접 관리한다고 생각하자!
'Dev > JPA' 카테고리의 다른 글
RS) 상속관계 매핑 (0) | 2022.02.22 |
---|---|
RS) 다대다 관계 (0) | 2022.02.17 |
RS) 양방향 연관관계와 연관관계의 주인 (0) | 2022.02.06 |
RS) 연관관계 매핑 기초 (0) | 2022.02.06 |
RS) 실전예제를 통한 문제점 분석 (0) | 2022.02.06 |