[JPA] 연관관계 Mapping

Jiwoo Kim·2020년 11월 17일
0

JPA 마스터하기

목록 보기
6/14
post-thumbnail

연관관계 Mapping

객체의 참조와 테이블의 FK를 매핑

방향(Direction)

  • 객체관계: [단방향, 양방향]
  • 테이블관계: 양방향

다중성(Multiplicity)

다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)

연관관계의 주인(Owner)

양방향 연관관계인 경우 주인을 정해야 함

객체와 테이블 연관관계의 차이

객체 연관관계테이블 연관관계
서로 다른 단방향 관계 2개양방향 관계
참조FK
객체 그래프 탐색JOIN

1:1 연관관계

  • 주 테이블에 FK
    • 단방향
    • 양방향
  • 대상 테이블에 FK
    • 양방향

N:1 단방향 연관관계

@JoinColumn (FK)

속성기능기본값
name매핑할 FK 이름필드명 + _ + 참조하는 테이블의 PK
referencedColumnNameFK가 참조하는 대상 테이블의 컬럼명참조하는 테이블의 PK 컬럼명

@ManyToOne (N:1)

속성기능기본값
optionalfalse이면 연관 엔티티가 항상 있어야 함true
fetchglobal fetch 전략 설정@ManyToOne=FetchType.EAGER
@ManyToOne=FetchType.LAZY
cascade영속전 전이 기능 사용

양방향 연관관계

단방향 매핑만으로 테이블과 객체 간 매핑은 완료되었지만, 객체 그래프 탐색 기능을 위해 양방향 매핑을 추가할 수 있다.

@OneToMany (1:N)

  • mappedBy

    • 양방향 관계일 때 테이블의 FK를 관리할 관계(Owner) 지정
    • Owner가 아닌 쪽에 Owner(필드 이름)을 지정하면 자동으로 매핑됨
    • Owner만 FK 값을 변경할 수 있고, 아닌 쪽은 객체 그래프 탐색만 가능
  • 구현 시 주의사항

    • 객체를 고려해서 Owner와 Onwer가 아닌 쪽 모두 값을 입력해야 함
    • 객체를 add 하는 것 뿐만 아니라 기존 관계를 제거하는 등, 로직을 견고하게 작성해야 함

N:N 연관관계

  • 관계형 DB는 다대다 관계를 정규화된 테이블 2개로 표현할 수 없고, 연결 테이블을 중간에 추가함
  • 객체는 객체 2개만으로 다대다 관계를 표현할 수 있음

@ManyToMany & @JoinTable

이 방법으로는 연결 테이블의 추가 컬럼을 표현할 수 없어 실무에 적용하기는 어려움

속성기능
name연결테이블 지정
joinColumns현재 엔티티를 참조하는 FK
inverseJoinColumns반대 방향 엔티티를 참조하는 FK
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT",
    joinColumns = @JoinColumn(name = "MEMBER_ID",
    inverseColumns = @JoinColumn(name = "PRODUCT_ID"))
private List<Product> products = new ArrayList<Product>();

연결 엔티티

  • 식별 관계: 복합 기본 키 매핑
    • @IdClass
    • @EmbeddedId
  • 비식별 관계: 새로운 기본 키
    • 보다 간결하게 매핑 가능 (추천)

본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다. (2020.09.10)

0개의 댓글