본문 바로가기
공부/Spring

[JPA] 다양한 연관관계 매핑

by JERO__ 2022. 7. 2.

연관관계 주인

  • 테이블 : 외래키 하나
  • 객체 : 참조가 두군데 (A→B, B→A)

연관관계 매핑

  1. 다대일 N:1 @ManyToOne

  1. 일대다 1:N @OneToMany
  • 일(1)이 연관관계 주인
  • 다(N) 쪽에 외래키가 존재
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행된다. 즉, 1:N 매핑보다 N:1 양방향 매핑을 사용하자.
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
  1. 일대일 1:1 @OneToOne

주 테이블이나 대상 테이블 중에 외래키를 선택할 수 있다.

  • 반대편은 mappedBy 매핑하기
  • // Member @OneToOne @JoinColumn(name = "LOCKER_ID") private Locker locker; // Locker @OneToOne(mappedBy = "locker") private Member member;
  • 그렇다면, 어느 곳에 외래키를 설정하는 것이 좋을까?
    1. 주 테이블에 외래키
      • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다
      • 단점 : 값이 없으면 외래키에 null이 허용된다. << nullable false 하면 되지 않나?
    2. 대상 테이블에 외래키 (단점이 치명적이다)
      • 장점 : 주 테이블과 대상 테이블을 1:1에서 1:N으로 변경할 때 테이블 구조를 유지할 수 있다. N쪽이 외래키를 가지기 때문.
      • 단점 : 지연로딩으로 설정해도 항상 즉시 로딩된다.
  1. 다대다 N:M @ManyToMany : 실무에서 쓰이지 않는다.
  • 관계형 DB에서 다대다를 표현할 수 없다.
  • ManyToMany를 OneToMany, ManyToOne으로 사용한다.

'공부 > Spring' 카테고리의 다른 글

[JPA] 값 타입  (0) 2022.07.02
[JPA] 프록시와 연관관계 관리(지연로딩)  (0) 2022.07.02
[JPA] 연관관계 매핑 기초  (0) 2022.07.02
[JPA] 엔티티 매핑  (0) 2022.07.02
[JPA] 영속성 관리 - 내부 동작 방식  (0) 2022.07.02

댓글