1 분 소요

연관관계 매핑 종류

JPA에서의 연관계 맺는 ERD에서 맺는 관계를 JPA에서 담당하는 어노테이션에 대한 포스트이다.

  • N : 1 - @ManyToOne
  • 1 : N - @OneToMany
  • 1 : 1 - @OneToOne
  • N : N - @ManyToMany

@ManyToOne

  • ERD에서 가장 흔히 보는 연관관계이다.
  • 다른 큰 주의 사항은 없다. fetch 전략을 LAZY로 잘 설정해 주자.

@OneToMany

  • 일대다 단방향은 일(1)쪽이 연관관계의 주인이다.
  • @JoinColumn을 꼭 사용해야 한다.
  • fetch 전략을 LAZY로 잘 설정해 주자.
  • ManyToOne보다는 사용성이 좀 떨어진다.
    이유는 관리하는 외래키가 다른곳에 있기 때문에 연관관계를 관리하기 위해서는 추가로 update가 나가야하기 한다.
  • 양방향으로 사용하는 경우엔 다쪽(N)을 연관관계의 주인으로 지정하여 @OneToMany를 사용하는 필드는 읽기전용으로 사용한다.

@OneToOne

사실상 이 포스트를 쓴 이유 이다. 주의해야하는 관계!

  • 일대일 관계는 그 반대도 일대일 관계이다.
  • 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하다.
  • LAZY(지연) 로딩이 잘 안됩니다. <- 처음 연관관계 매핑시 상당히 애먹은 부분중 하나
    • 지연 로딩을 하기위해 설정해야 할것들이 많다.
    • optional=false 옵션을 추가하여 not null이라는것을 jpa에 알려줘야한다.
    • 단방향 일대일 관계여야하며 무조건 PK로만 조인해야한다.

      jpa가 프록시가 일대일관계의 경우 해당 객체가 존재하는지 존재하지않는지 DB를 조회하지않고 확인할 방법이없다.
      최대한 안쓰거나 @MapsId같은 경우로 해결하는 것을 더 권장한다.

@ManyToMany

사실상 이 포스트를 쓴 이유 2 주의해야하는 관계!
RDB에서는 정규화된 테이블 2개를 다대다 관계를 표현할수 없다.
하지만 객체는 컬렉션을 사용해서 표현이 가능하다.
쓰지않는 것을 권장합니다.
매핑테이블을 이용하여 일대다, 다대일관계로 사용하는것이 좋다.

댓글남기기