Free Lines Arrow
본문 바로가기
DataBase/JPA

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

by skahn1215 2021. 8. 7.
728x90
반응형

다양한 연관관계 맵핑

연관관계 맵핑의 종류에 대해 알아보자.

 

 

연관관계 맵핑의 종류

  • N:1 
  • 1:N
  • 1:1
  • N:M

 

 

연관관계 어노테이션 종류

  • @ManyToOne: N:1
  • @OneToMany: 1:N
  • @OneToOne:    1:1
  • @ManyToMany: N:N 실무에서는 안쓴다.

 

 

용어

 

단방향 , 양방향

  • 단방향:  A 와 B 테이블이 있을때 A -> B 한방향으로 참조하는 것이다.
  • 양방향은: A 와 B 테이블이 있을때 A->B, A<-B 양쪽으로 참조하는것이다.
  • 테이블의 방향성
    - 외래키 하나로 양쪽 조인가능
    - 방향 개념이 없다

  • 객체의 방향성
    - 참조용 필들가 있는 쪽으로만 참조가능
    - 한쪽만 참조하면 단방향
    - 양쪽이 서로 참조하면 양방향

 

 

연관관계 주인

  • 테이블은 외래 키 하나로 두테이블이 연관관계를 맺는다.
  • 객체 양방향 관계는 참조가 두군데이다.
  • 객체 양방향 관계일때는 외래키를 관리할 곳을 지정해햐된다.
  • 연관관계의 주인: 외래 키를 관리하는 참조이다.
  • 주인의 반대편: 외래키에 영향을 주지 않는다. 단순한 조회만 가능한다.

 

 

 

연관관계 맵핑 분석

 

다대일 [N:1] 단방향

  • 가장많이 사용하는 연관관계이다.
  • 다대일의 반대는 일대다이다.
  • @JoinCoulmn 을 사용하여 구현한다.

 

 

 

 

 

 

다대일 [N:1] 양방향

  • 외래키가 있는 쪽이 연관관계 주인이다.
  • 양쪽을 서로 참조하도록 개발한다.
  • N에는 @ManyToOne 와 @JoinColumn 사용
  • 1에는  @OneToMany를 사용하여 구현한다.

 

 

 

일대다 [1:N] 단방향

  • 잘안쓰는 방법이다.
  • 실무에서 사용하면 운영이 힘들어진다.
  • Team 에 members를 수정하면 MEMBMER 에 있는 외래 키를 업데이트 해줘야 한다.
  • 그럼 Member 테이블에서 업데이트 쿼리가 발생한다.
  • 수정한 쪽은 Team 인데 MEMBER에도 쿼리가 나간다.
  • 1. Member Insert 쿼리 발생
  • 2. Team Inset 쿼리발생
  • 3. Member FK 업데이트 발생
  • N:1을 쓰자.

 

  • N:1 과 차이점
  • 1 이 되는 쪽이 주인이 된다.
  • 반드시 @JoinColum 을 써야한다 그렇지 않으면 TableJoin이 되어 테이블이 하나더 생성된다.

 

 

 

일대다 [1:N] 양방향

존재 하지 않는다.

 

 

 

 

일대일 [1:1] 단방향

  • 일대일 관계는 그밴다도 일대일
  • 주테이블 이나 대상 테이블 중에 외래키 선택 가능하다.
  • 외래키에 데이터 베이스 유니크 제약 조건 추가.
  • N:1 단방향 매핑과 유사하다.

 

 

 

구현

Member

package directionmapping.onetoone;

import javax.persistence.*;


// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class OneToOenMember {
    @Id //PK 설정
    @GeneratedValue
    @Column(name = "OTO_MEMBER_ID")
    private Long id;

    // 컬럼이름을 지정해준다.
    private String name;

    @OneToOne
    @JoinColumn(name = "OTO_LOCKER_ID")
    private Locker locker;
}

 

 

Locker

package directionmapping.onetoone;

import javax.persistence.*;

@Entity
public class Locker {
    @Id @GeneratedValue
    @Column(name = "OTO_LOCKER_ID")
    private Long id;
    private String name;
}

 

 

 

 

일대일 [1:1] 양방향

 

Locker 만 변경하면 된다.

package directionmapping.onetoone;

import javax.persistence.*;

@Entity
public class Locker {
    @Id @GeneratedValue
    @Column(name = "OTO_LOCKER_ID")
    private Long id;
    private String name;
    
   @OneToOne(mappedBy = "locker")
   private Member member;
}

 

 

 

 

 

참고: https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21703?tab=curriculum 

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] @MappedSuperclass  (0) 2021.08.09
[JPA] 고급 매핑1: 상속관계 맵핑  (0) 2021.08.08
[JPA] 연관관계 매핑기초5: 예제  (0) 2021.08.04
[JPA] 연관관계 매핑기초4: 정리  (0) 2021.08.03
[JPA] mappedBy  (0) 2021.08.02

댓글