[자바 표준 ORM JPA]5장 연관관계 매핑 기초

객체의 참조와 테이블의 외래키를 매핑하는 것이 목표!

  • 방향성: 단방향, 양방향
  • 다중성: 다대일, 일대다, 일대일, 다대다
  • 연관관계의 주인: 양방향 관계로 만들면 연관관계의 주인을 설정해야한다.

    단방향 연관관계

@JoinColumn

외래키를 매핑할 때 사용된다.
속성:

  • name: 매핑할 외래 키 이름 (필드명 + _ + 참조하는 테이블의 기본 키 컬럼명)
  • referencedColumnName: 외래키가 참조하는 대상 테이블의 컬럼명 (참조하는 테이블의 기본키 컬럼명)
  • foreignKey(DDL): 외래키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다.
  • unique, nullable, insertable, updateable, columnDefinition, table: @Column의 속성과 같다.

@ManyToOne

다대일 관계에서 사용한다.
속성:

  • optional: false로 설정하면 연관된 엔티티가 항상 있어야 한다. (true)
  • fetch: 글로벌 페치 전략을 설정한다. (@ManyToOne=FetchType.EAGER, @OneToMany=FetchType.LAZY)
  • cascade: 영속성 전이 기능을 사용한다.
  • targetEntity 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제너릭으로 타입 정보를 알 수 있다.

양방향 연관관계

mappedBy 속성은 양방향 매핑일때 사용한다. 보통 반대쪽 매핑의 필드 이름을 값으로 주면 된다.
양방향 연관관계 매핑을 지켜야 할 규칙이 있는데

  1. 연관관계의 주인을 정해야 한다. 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.
    • 주인은 mappedBy 속성을 사용하지 않는다.
    • 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.

데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래키를 가진다. 다 쪽인 @ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다. 따라서 @ManyToOne에는 mappedBy 속성이 없다.

정리

  • 단반향 매핑만으로 테이블과 객제츼 연관관계 매핑은 이미 완료되었다.
  • 단방향을 양방향으로 만들면 반대 방향으로 객체 그래프 탐색 기능이 추가된다.
  • 양방향 연관관계를 매핑하려면 객체에서 양쪽 방향을 모두 관리해야 한다.
  • 연관관계의 주인은 외래 키의 위치와 관견해서 정해야지 비즈니스 중요도로 접근하면 안 된다.

Categories:

Updated:

Leave a comment